小编典典

Java 8流:多个过滤器与复杂条件

java

有时你想过滤Stream具有多个条件的a:

myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...

或者你可以做同样的复杂条件和单 filter:

myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...

我的猜测是第二种方法具有更好的性能特征,但我不知道。

第一种方法赢得了可读性,但是哪种性能更好?


阅读 2653

收藏
2020-03-21

共1个答案

小编典典

两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。

组合两个过滤器实例将创建更多的对象,从而创建更多的委托代码,但是如果你使用方法引用而不是lambda表达式(例如,替换filter(x -> x.isCool())为),则可以更改这种情况filter(ItemType::isCool)。这样,你就消除了为lambda表达式创建的综合委托方法。因此,与filter使用带有的lambda表达式的单个调用相比,使用两个方法引用组合两个过滤器可能会创建相同或更少的委托代码&&

但是,如上所述,这种开销将由HotSpot优化器消除,并且可以忽略不计。

理论上,两个过滤器比单个过滤器更容易并行化,但这仅与计算量大的任务有关¹。

因此,没有简单的答案。

最重要的是,不要考虑气味检测阈值以下的性能差异。使用更具可读性的内容。

¹…并且将需要一个实现对后续阶段进行并行处理的实现,这是标准Stream实现目前未采取的方法

2020-03-21