问题描述
我有这两种方法,它们调用异步API并在存在值的情况下返回Mono<Boolean>
。为了这个示例,我将返回一个随机布尔值,
private Mono<Boolean> checkFirstExists() {
// Replacing actual API call here
return Mono.just(Boolean.FALSE);
}
private Mono<Boolean> checkSecondExists() {
// Replacing actual API call here
return Mono.just(Boolean.TRUE);
}
现在,我有另一个方法应该将这两个方法的结果结合起来,如果checkFirstExists
或checkSecondExists
为真,则只返回一个布尔值。
private boolean checkIfExists() {
// Should return true if any of the underlying method returns true
final Flux<Boolean> exists = Flux.concat(checkFirstExists(),checkSecondExists());
return exists.blockFirst();
}
做到这一点的最佳方法是什么? Mono.zip
也许?任何帮助都会很棒。
解决方法
Mono.zip是用于在继续之前等待多个异步操作完成的正确方法。这样的事情应该起作用:
return Mono.zip(checkFirstExists(),checkSecondExists(),(first,second) -> first && second);
或者,如果提供了列表,则:
private boolean checkIfExists()
{
return allTrue(Arrays.asList(checkFirstExists(),checkSecondExists())).blockOptional().orElseThrow(() -> new IllegalStateException("Invalid State"));
}
private Mono<Boolean> allTrue(List<Mono<Boolean>> toAggregate)
{
return mergeMonos(toAggregate).map(list -> list.stream().allMatch(val -> val));
}
@SuppressWarnings("unchecked")
private <T> Mono<List<T>> mergeMonos(List<Mono<T>> toAggregate)
{
return Mono.zip(toAggregate,array -> Stream.of(array).map(o -> (T) o).collect(Collectors.toList()));
}
无关的注释:
通常,在构造反应流时,应使操作尽可能长时间保持异步。可能值得让'checkIfExists'函数返回Mono而不是阻塞。