组合Mono布尔结果



我有这两个方法,它们调用异步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);
}

现在,我有了另一个方法,它应该将这两个方法的结果组合起来,如果checkFirstExistscheckSecondExists为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而不是阻塞可能是值得的。

最新更新