合并单布尔结果

问题描述

我有这两种方法,它们调用异步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为真,则只返回一个布尔值。

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而不是阻塞。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...