RxJava - Observable - 多个过滤器调用与一个过滤器调用

sas*_*sas 3 java rx-java rx-java2

我想过滤 Observable 发出的项目,但我有很多过滤条件,我想知道什么是更好的方法 - 性能方面。

一种方法是调用一个“过滤器”方法,该方法具有多个“if”语句中的所有条件并返回最终过滤结果,然后调用:

observable
    .filter(this::filter)
Run Code Online (Sandbox Code Playgroud)

另一种方法是拥有多个“filterX”方法,每个方法按特定条件过滤,并在链中调用它们:

observable
    .filter(this::filterX)
    .filter(this::filterY)
    .filter(this::filterZ)
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 是否有任何性能差异,两者中哪一个是“更好的做法”?我发现第二个更好,更易读,但目前我遇到了一个带有 ~30 个“if”语句的“过滤器”方法,我想知道我是否应该打扰并将它重构为第二种方法。

Gus*_*avo 5

RxJava 库尝试用Operator Fusion的概念来优化你所描述的场景:

算子融合的前提是某些算子可以组合成一个单一的算子(宏融合)或其内部数据结构彼此共享(微融合),从而允许更少的分配、更低的开销和更好的性能。

它在设计文档中给出了一个关于过滤器运算符的具体示例:

  • a 是 b 并且两个算子的参数集可以合并为一个应用程序。示例:filter(p1).filter(p2) 组合成 filter(p1 && p2)。

因此,在您的情况下,库将尽最大努力组合所有过滤器,以免产生太大的性能差异。