Java 8 mapToInt ( mapToInt(e -> e) ) 如何准确地提高性能?

2022-09-01 17:25:10

我正在阅读“Java 8 Lambdas”一书,在某个时候,作者说“由于性能优势,尽可能使用原始的专用函数是个好主意。

他在这里指的是mapToInt,mapToLong等。

问题是,老实说,我不知道表演从何而来。

让我们考虑一个例子:

    // Consider this a very very long list, with a lot of elements
    List<Integer> list = Arrays.asList(1, 2, 3, 4);

    //sum it, flavour 1
    int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue();

    //sum it, flavour 2
    int sum2 = list.stream().mapToInt(e -> e).sum();

    System.out.println(sum1 + " " + sum2);

因此,在第一种情况下,我使用reduce对值求和,因此BinaryOperator函数将始终接收int(acc)和Integer(集合的当前元素),然后将Inteque解包到int(acc + e)

在第二种情况下,我使用mapToInt,它将每个整数取消装箱到一个int中,然后对其进行求和。

我的问题是,第二种方法有什么好处吗?另外,当我可以使用map时,map to int的意义是什么?

所以,是的,这一切都只是糖语法还是有一些性能优势?如果是这样,请提供一些信息

问候


答案 1

还有一个额外的拳击水平正在进行中

int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue();

因为约简函数是一个 - 它传递两个值,取消装箱,添加它们,然后重新装箱结果。该版本将列表中的元素取消装箱一次,然后从该点开始作为 .BinaryOperator<Integer>IntegermapToIntIntegerintIntStream


答案 2

推荐