为了账号安全,请及时绑定邮箱和手机立即绑定

JVM 能否从循环内提升 Java 流?

JVM 能否从循环内提升 Java 流?

慕标5832272 2021-09-29 16:39:21
我想知道 JVM 是否能够将流提升到循环之外,例如在我写的这个交叉检查中:for (SomeObject someObject:someObjects) {    if (someList.stream().map(SomeObject::getValue).collect(Collectors.toList())            .contains(someObject.getValue())) {        //do some error stuff    }}我是否有必要像这样重构它:final List<Value> values = someList.stream().map(SomeObject::getValue).collect(Collectors.toList());for (SomeObject someObject:someObjects) {    if (values.contains(someObject.getValue()) {        //do some error stuff    }}这样的代码看起来可能更好看,但我只是想知道它是否会有很大的性能差异。
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

我敢打赌“不”。AFAIK JVM 没有进行过程间优化。可能有一些例外,但基本上,它一次只优化一个方法。为了使这真正有用,它依赖于内联,但是您的表达式对于内联来说太复杂了。


无论如何,你的第二个片段


final List<Value> values = someList.stream().map(SomeObject::getValue).collect(Collectors.toList());

for (SomeObject someObject:someObjects) {

    if (values.contains(someObject.getValue()) {

        //do some error stuff

    }

}

也不是最优的。随着循环内的流,你可以使用


...anyMatch(v -> v.equals(someObject.getValue())

以节省自己的收藏。或者,更好的是,您可以使用 aSet进行更快的查找。


查看完整回答
反对 回复 2021-09-29
?
忽然笑

TA贡献1806条经验 获得超5个赞

是的,第二个代码更好,在第一个代码中,您从头开始为每个“SomeObject”创建流。


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信