【发布时间】:2015-10-18 22:48:55
【问题描述】:
我已经快速阅读了Oracle Lambda Expression 文档。
不过,这种例子帮助我更好地理解:
//Old way:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for(Integer n: list) {
System.out.println(n);
}
//New way:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n));
//or we can use :: double colon operator in Java 8
list.forEach(System.out::println);
不过,我还是不明白为什么这是一项创新。这只是“方法变量”结束时死亡的方法,对吗?为什么我要使用这个而不是真正的方法? 就性能而言,这将是更好的选择。 Lambda 或简单循环。
【问题讨论】:
-
就性能而言,您的 println 占用大约 1K * 到 10K * 其余代码的 CPU。如果您消除了 println,您仍然会发现代码尚未预热的事实可能意味着 50 倍的性能差异。如果您预热您的代码,您可能会发现您使用
List<Integer>而不是int[]是您的下一个最大热门......您离需要知道 Stream 或 loop 是否更快。 -
@PeterLawrey 我同意,如果你想提高性能,你必须仔细查看你的代码。你甚至必须决定这一切是否有必要。但据我了解 OP,这不是关于这个特定的“示例”,而是 lambda 和循环之间的整体差异。
-
@Olli1511 好点,但我想说的是,对于广泛的示例,差异是 a) 不太重要,b) 可能会根据您使用的 Java 8 更新而改变。恕我直言,您应该编写您认为最清晰的代码,并在测量出您遇到问题时担心性能。
-
@PeterLawrey 我完全同意你的观点。我只是在想有人因为标题而访问这个问题。我会期待关于这两种方法的性能的答案。事件虽然,正如您所提到的,对于 99.9% 的访问者来说,考虑性能差异是没有意义的,但如果它确实在 0.01% 中很重要(我可以'没有想到一个场景,但可能有一个)?这些访问者不应该得到他们问题的答案,而不仅仅是“不在乎”吗?
-
@Olli1511 没有一个在所有情况下都是正确的广泛答案。答案是视情况而定。我见过使用 lambda 比较慢和比较快的情况。我还看到,通过更新的更新,您可以获得更优化的代码。