JVM是否可以从循环中提升Java流?

时间:2018-09-20 10:51:21

标签: java performance optimization jvm

我想知道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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我敢打赌“不”。 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())

以保存自己的收藏。或者,更好的是,您可以使用Set来加快查找速度。