有时,您希望筛选具有多个条件的Stream:

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

或者,您也可以对复杂的情况和single filter执行相同的操作:

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

我的猜测是,第二种方法具有更好的性能特征,但我不这么认为.

第一种方法在可读性方面获胜,但什么对性能更好呢?

推荐答案

这两个备选方案必须执行的代码非常相似,以至于您无法可靠地预测结果.底层对象 struct 可能不同,但这对热点优化器不构成挑战.因此,这取决于周围的其他条件,如果有任何不同的话,这些条件将导致更快的执行.

组合两个过滤器实例会创建更多对象,从而产生更多委派代码,但如果使用方法引用而不是lambda表达式,这可能会发生变化,例如,用filter(ItemType::isCool)替换filter(x -> x.isCool()).这样就消除了为lambda表达式创建的合成委派方法.因此,使用两个方法引用组合两个过滤器可能会创建与使用带有&&的lambda表达式的单个filter调用相同或更少的委托代码.

但是,如前所述,这种开销将被热点优化器消除,可以忽略不计.

理论上,两个过滤器可能比一个过滤更容易并行化,但这只适用于计算量相当大的高强度任务?

所以没有简单的答案.

底线是,不要考虑低于气味检测阈值的性能差异.使用更具可读性的内容.


1.…并且需要一个对后续阶段进行并行处理的实现,这是标准流实现目前没有走的路

Java相关问答推荐

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

为什么Java中的两个日期有差异?

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

在AnyLogic中增加变量计数

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

JUnit—如何模拟局部变量对象方法调用

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

Java Telnet客户端重复的IAC符号

垃圾回收器是否真的删除超出作用域的对象?

如何获得凌空cookies ,并设置它在下一个请求- android

为什么项目名称出现在我的GET请求中?

Bash数组的单引号元素并使用空格连接

Java返回生成器的实现

spring 更新多项管理关系

Eureka客户端无法使用用户/通行证注册到Eureka服务器

Maven创建带有特定类的Spring Boot jar和普通jar

如何在Java上为循环数组从synchronized迁移到ReentrantLock

在不带instanceof或switch的java中记录模式

如何在 Android Studio 中删除 ImageView 和屏幕/父级边缘之间的额外空间?