如何解决合并单布尔结果
我有这两种方法,它们调用异步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而不是阻塞。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。