Java Streams .max() 和 .min() 性能滞后?

Java Streams .max() and .min() lag in performance?

考虑以下 2 个示例。

1 有流

myList.stream().map(this::getInt).max(Integer::compareTo);

2 老办法

int max = Integer.MIN_VALUE;
for (MyItem item : myList) {
    max = Math.max(max, getInt(item));    
}

以上 getInt 方法接受 MyItem 参数和 returns int 结果。

在这里,与#1 相比,#2 的延迟要低得多。有谁知道为什么或我出了什么问题吗?

您或许应该利用 Streams 的功能来优化这些情况。阅读 Streams 的文档,第一个示例显示了 IntStream 的优化路径。

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

     int max = myList.stream()
                      .mapToInt(this::getInt)
                      .max()
                      .orElse(Integer.MIN_VALUE);
myList.stream().mapToInt(this::getInt).max()

尝试 mapping to an IntStream. An IntStream works with ints internally, which avoids the overhead of boxing and unboxing Integer objects. Also, IntStream.max() 不需要自定义比较器。

So you suggest that the prominent reason is 'boxing' and 'unboxing'?

如果没有 运行 它通过你的基准测试,我不知道它是否会匹配 for 循环的性能。但它会有所改善。如果它不够好,那么我建议坚持使用循环,因为我看不到任何其他改进它的方法。