Java 如何迭代通量并使用另一个Mono的结果来过滤通量

Java 如何迭代通量并使用另一个Mono的结果来过滤通量,java,spring-webflux,project-reactor,reactive,Java,Spring Webflux,Project Reactor,Reactive,我想从满足条件的通量中发出第一个元素-MyObj1.getX()&&obj.getY(),即使通量中还有其他元素与条件匹配。该标准基于mono的响应(这是一个反应性mongo db调用)和发射通量元素的少量事实。方式1: foreach(MyObj2 obj : availabilityInfo){ if(MyObj1.getX() && obj.getY()){ return or break; } } 这两种方法都将为我提供输

我想从满足条件的通量中发出第一个元素-
MyObj1.getX()&&obj.getY()
,即使通量中还有其他元素与条件匹配。该标准基于mono的响应(这是一个反应性mongo db调用)和发射通量元素的少量事实。

方式1:

 foreach(MyObj2 obj : availabilityInfo){
      if(MyObj1.getX() && obj.getY()){
         return or break;
      }
  }
这两种方法都将为我提供输出:

 Mono<Integer> mono = Mono.just(3);
        Flux<Integer> flux = Flux.just(1, 2, 3, 4, 5, 6);
        //Way 1
        Mono<Integer> res = mono.flatMapMany(i -> flux.filter(j -> j % i == 0).take(1)).single();

        res.subscribe(System.out::println);

        //Way 2
       flux.collectList().zipWith(mono).flatMap(tuple -> {
        List<Integer> list = tuple.getT1();
        int x = tuple.getT2();
        for(int y:list){
            if(y%x==0){
                return Mono.just(x);
            }
        }
        return Mono.empty();
    }).subscribe(System.out::println);

你能具体说明你想做什么吗?对于迭代,可以在通量上使用
flatMap
;对于过滤,可以使用
filter
操作符。请仔细阅读通量和单声道文档。它们很有用。谢谢你的回复。我希望迭代通量,然后使用单声道响应进行过滤,如下所示。您可以看到我之前的评论。@uneq25我很快点击了enter。现在更新了问题,请看一看这是什么意思,
MyObj1.getX()&&obj.getY()
?似乎不是一个有效的布尔表达式。你是想检查它们是否相等还是不为空?我们不需要通过
flatMap
订阅内部通量吗。我试过了,但是在flux发出响应(WebClient调用)之前Mono返回。如果你想用它做些什么,你可以在最后订阅
filteredInfo
flux。@akreddy.21你能清楚地指定你在代码方面做什么吗?我还为您提供了一个示例代码来可视化事物。与您在示例中指定的内容基本相同。唯一额外的事情是,一旦我找到3,我就可以返回,我不需要处理剩余的通量元素。是否有任何方法与您联系,以便我可以准确地显示我正在尝试做的事情。那会有帮助的
 Mono<MyObj2> filteredInfo = mono1.flatMapMany(myObj1 -> 
                                        availabilityInfo.filter(myObj1 -> myObj1.getX() && myObj2.getY()).take(1)).single();
Mono<MyObj2> filteredInfo  = availabilityInfo.collectList().zipWith(mono1).flatMap(tuple -> {
            List<MyObj2> list = tuple.getT1();
            MyObj1 myObj1 = tuple.getT2();
            for(MyObj2 myObj2:list){
                if(myObj1.getX() && myObj2.getY()){
                    return Mono.just(myObj2);
                }
            }
            return Mono.empty();
        });
 Mono<Integer> mono = Mono.just(3);
        Flux<Integer> flux = Flux.just(1, 2, 3, 4, 5, 6);
        //Way 1
        Mono<Integer> res = mono.flatMapMany(i -> flux.filter(j -> j % i == 0).take(1)).single();

        res.subscribe(System.out::println);

        //Way 2
       flux.collectList().zipWith(mono).flatMap(tuple -> {
        List<Integer> list = tuple.getT1();
        int x = tuple.getT2();
        for(int y:list){
            if(y%x==0){
                return Mono.just(x);
            }
        }
        return Mono.empty();
    }).subscribe(System.out::println);
3