我有这两个方法,它们调用异步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
为true,则只返回一个布尔值。
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而不是阻塞可能是值得的。