使 filterWhen() 与 Mono 谓词并行

Posted

技术标签:

【中文标题】使 filterWhen() 与 Mono 谓词并行【英文标题】:making filterWhen() with Mono predicate parallel 【发布时间】:2021-01-22 19:25:03 【问题描述】:

使用 Reactor Flux 过滤器时,我看到了一些我需要克服的行为。

给定以下代码:

Flux.fromIterable(List.of(1,2))
  .filterWhen(it -> predicateMono(it))

地点:

Mono<boolean> predicateMono(int value)  ...  

我注意到predicateMono()s 是按顺序执行的,这意味着对于值 2,在第一个完成之前不会调用操作。

当我的代码中的predicateMono()s 是对我想并行执行的后端系统的http 调用时,这会成为一个问题。如何编写此代码以便可以并行过滤通量值?

predicateMono() 是非阻塞 http 调用,与响应式方法兼容。

【问题讨论】:

在使用之前阅读标签。单声道标签不适用于 Java。 【参考方案1】:

解决方案是使用flatmap 而不是filterwhen。如果您想过滤掉,只需映射到空。 Flux 上的空值会被后续操作忽略。

Flux.fromIterable(List.of(1, 2))
        .flatMap(it ->
            predicateMono(it).flatMap(result ->
                result ? Mono.just(it) : Mono.empty()));

【讨论】:

以上是关于使 filterWhen() 与 Mono 谓词并行的主要内容,如果未能解决你的问题,请参考以下文章

Prolog:为啥这个谓词找到了答案却忽略了它并继续与[]统一?

如何使 NSExpression 的 expressionForFunction:withArguments: 尊重获取请求的谓词

xCode / iOS - 需要帮助使核心数据搜索谓词工作

C#编写的winform程序使用mono脱离.net框架,调用open方法访问access使程序界面消失

将 mono 与嵌入它的 c++ 应用程序捆绑在一起

NHibernate 与 LINQ(谓词?)