首页 > 解决方案 > Flux.any正确使用

问题描述

我有一个 Flux.fromIterable(list of ids) 。我想知道是否有任何记录为 null 。所以我正在尝试使用 Flux.any 但我发现我什至没有在任何内容中打印任何内容并直接转到 doOnEach ,因为结果输出为假。我们如何解决这个问题?解决方案不应仅限于空检查。它可以是任何布尔条件。


    Mono<Boolean> isAnyNull =Flux.fromIterable(request.getIds())
        .switchIfEmpty(Mono.error(new SomeException("No elements")))
        .flatMap(id->{
          return FooRepo.find(id);
          }).any(p->{
          System.out.println("check is any null p?."+p);
          return ((p==null)||(p.getId()==null));
        }).doOnEach(System.out::println);

我在下面尝试了一个奇怪的临时修复,但我不确定这是否正确。另外我认为它只适用于 null。

Mono<Boolean> isAnyNull = Flux.fromIterable(request.getds())
        .switchIfEmpty(Mono.error(new SomeException("No elements")))
        .flatMap(id -> {
          return FooRepo.find(id);
         })
        .switchIfEmpty(Mono.error(new SomeException("INVALID_ID"))).hasElements()
        .doOnEach(System.out::println);

更新:这也有效并使用流检查 null - 评论感谢改进

Flux.fromIterable(request.getIds())
     .switchIfEmpty(Mono.error(new SomeException("No elements")))
        .flatMap(id -> {
          return FooRepo.find(id);
        })
        .any(foo -> {
         return (Objects.nonNull(foo)||foo.getId()!=null);
        }).doOnEach(System.out::println);

标签: spring-webfluxproject-reactor

解决方案


推荐阅读