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

问题描述 投票:1回答:2

考虑以下2个例子。

1 有了Streams

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 参数,并返回一个 int 的结果。

这里,2号给我的延迟比1号低很多。有谁知道为什么或有什么问题吗?

java java-8 java-stream max min
2个回答
4
投票
myList.stream().mapToInt(this::getInt).max()

试试 映射到一个 IntStream. 安 IntStreamint的内部,避免了装箱和拆箱的开销。Integer 对象。另外: IntStream.max() 不需要自定义比较器。

所以你建议突出的原因是'装箱'和'拆箱'?

在没有通过你的基准运行之前,我不知道它是否能与 for 循环的性能。但这将是一个改进。如果还不够好,那么我建议继续使用循环,因为我看不到任何其他的方法来改善它。


2
投票

你可能应该利用Streams的特性,它应该可以优化这些情况。阅读Streams的文档,第一个例子显示了IntStream的优化路径。

https:/docs.oracle.comjavase8docsapijavautilstreamStream.html。

     int max = myList.stream()
                      .mapToInt(this::getInt)
                      .max()
                      .orElse(Integer.MIN_VALUE);
© www.soinside.com 2019 - 2024. All rights reserved.