我想知道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
}
}
这样看起来代码看起来可能更好,但是我只是想知道它是否会有很大的性能差异。
答案 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
来加快查找速度。