我想知道 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进行更快的查找。
添加回答
举报
0/150
提交
取消