猿问

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

我想知道 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

    }

}

这样的代码看起来可能更好看,但我只是想知道它是否会有很大的性能差异。


慕标5832272
浏览 156回答 2
2回答

慕雪6442864

我敢打赌“不”。AFAIK JVM 没有进行过程间优化。可能有一些例外,但基本上,它一次只优化一个方法。为了使这真正有用,它依赖于内联,但是您的表达式对于内联来说太复杂了。无论如何,你的第二个片段final List<Value> values = someList.stream().map(SomeObject::getValue).collect(Collectors.toList());for (SomeObject someObject:someObjects) {&nbsp; &nbsp; if (values.contains(someObject.getValue()) {&nbsp; &nbsp; &nbsp; &nbsp; //do some error stuff&nbsp; &nbsp; }}也不是最优的。随着循环内的流,你可以使用...anyMatch(v -> v.equals(someObject.getValue())以节省自己的收藏。或者,更好的是,您可以使用 aSet进行更快的查找。

忽然笑

是的,第二个代码更好,在第一个代码中,您从头开始为每个“SomeObject”创建流。
随时随地看视频慕课网APP

相关分类

Java
我要回答