Repository返回类型从Stream改Flux后,响应式实现调整咨询
适配ReactiveMongoRepository的Kotlin方法修改
你现在的代码里用asSequence()把Flux转成Sequence的方式不符合响应式编程的非阻塞设计,还会丧失ReactiveMongoRepository的核心优势。以下是修改后的代码,既能保持原业务逻辑,又能适配响应式架构:
@Autowired private lateinit var repository: DomainRepository private fun fetchValidResponses(request: ModelRequest): Flux<DomainResponse> { return repository.findByRequestId(request.requestId) .filter { it.product.intersect(request.product).isNotEmpty() } .filter { it.errors?.isEmpty() ?: true } }
关键改动说明:
- 返回类型调整:把
Sequence<DomainResponse>改为Flux<DomainResponse>,保持响应式流的特性,避免阻塞线程。 - 移除
asSequence():Flux自带响应式操作符,不需要转成集合类的Sequence来处理过滤逻辑。 - 优化空安全判断:用Kotlin的空安全语法
it.errors?.isEmpty() ?: true替代原有的非空断言!!,避免潜在的空指针异常,代码更健壮。
特殊场景处理(不推荐)
如果你的业务场景必须同步获取Sequence(比如依赖同步API的旧代码),可以用阻塞方式获取,但这会违背响应式编程的非阻塞原则,仅作为临时兼容方案:
private fun fetchValidResponsesBlocking(request: ModelRequest): Sequence<DomainResponse> { return repository.findByRequestId(request.requestId) .filter { it.product.intersect(request.product).isNotEmpty() } .filter { it.errors?.isEmpty() ?: true } .collectList() .block() ?.asSequence() ?: emptySequence() }
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

