You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不阻塞地利用Filter Flux过滤Range Flux中的值?

无需阻塞操作实现Flux间过滤的方案

当然可以,完全不用阻塞的toStream()操作就能实现需求。核心是利用Reactor的非阻塞收集方法,结合响应式操作符完成过滤,全程保持异步非阻塞特性:

Flux<String> filterFlux = Flux.just("2", "3", "4", "5");
Flux<Integer> rangeFlux = Flux.range(1, 10);

StepVerifier.create(
        // 非阻塞收集filterFlux的所有元素到List
        filterFlux.collectList()
                // 用收集到的List过滤rangeFlux
                .flatMapMany(filterList -> 
                        rangeFlux.map(String::valueOf)
                                .filter(s -> !filterList.contains(s))
                )
)
.expectNext("1")
.expectNextSequence(List.of("6", "7", "8", "9", "10"))
.expectComplete()
.verify();

关键说明:

  • collectList():异步收集filterFlux的所有元素到List,返回Mono<List<String>>,全程不会阻塞线程
  • flatMapMany:将Mono中拿到的过滤列表,用来处理rangeFlux的过滤逻辑,最终返回过滤后的Flux
  • 整个流程完全遵循响应式编程的非阻塞原则,避免了原代码中toStream()带来的线程阻塞问题

如果你的filterFlux是无限流,这种方式不适用(因为collectList()会一直等待流完成),但针对你给出的有限流场景,这个方案完全可行。

内容的提问来源于stack exchange,提问作者Artyom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:15:43