Ratpacked: Conditionally Map or Flatmap a Promise
Ratpack's Promises are versatile. There are special map and flatMAP 'if' methods you can use that will transform values based on predicates.
Join the DZone community and get the full member experience.
Join For FreeWhen we want to transform a Promise
value, we can use the map
and flatMap
methods. There are also variants to this method that will only transform a value when a given predicate is true: mapIf
and flatMapIf
. We provide a predicate and function to the methods. If the predicate is true the function is invoked, otherwise, the function is not invoked and the promised value is returned as is.
In the following example, we have two methods that use the mapIf
and flatMapIf
methods of the Promise
class:
// File: src/main/java/mrhaki/ratpack/NumberService.java
package mrhaki.ratpack;
import ratpack.exec.Promise;
public class NumberService {
public Promise<Integer> multiplyEven(final Integer value) {
return Promise.value(value)
.mapIf(number -> number % 2 == 0, number -> number * number);
}
public Promise<Integer> multiplyTens(final Integer value) {
return Promise.value(value)
.flatMapIf(number -> number % 10 == 0, number -> multiplyEven(number));
}
}
Now we take a look at the following specification to see the result of the methods with different input arguments:
// File: src/test/groovy/mrhaki/ratpack/NumberServiceSpec.groovy
package mrhaki.ratpack
import ratpack.test.exec.ExecHarness
import spock.lang.Specification
import spock.lang.Subject
class NumberServiceSpec extends Specification {
@Subject
private final numberService = new NumberService()
void 'even numbers must be transformed with mapIf'() {
when:
final result = ExecHarness.yieldSingle {
numberService.multiplyEven(startValue)
}
then:
result.value == expected
where:
startValue || expected
1 || 1
2 || 4
3 || 3
4 || 16
}
void 'ten-th numbers must be transformed with flatMapIf'() {
when:
final result = ExecHarness.yieldSingle {
numberService.multiplyTens(startValue)
}
then:
result.value == expected
where:
startValue || expected
1 || 1
10 || 100
2 || 2
20 || 400
}
}
Written with Ratpack 1.4.5.
Published at DZone with permission of Hubert Klein Ikkink, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments