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

时间:2014-08-12 16:21:43

标签: java lambda java-8 java-stream

我正在阅读“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(集合的当前元素)然后将取消装箱整数到int(acc + e)

在第二种情况下,我使用mapToInt,它将每个Integer解包成一个int,然后对它求和。

我的问题是,第二种方法有什么优势吗? 当我可以使用map时,还有什么地方可以映射到int?

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

此致

1 个答案:

答案 0 :(得分:26)

中有更多级别的拳击
int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue();

因为缩减函数是BinaryOperator<Integer> - 它会传递两个Integer值,将它们取消装箱,添加它们,然后重新打包结果。 mapToInt版本会将列表中的Integer元素取消装箱,然后使用原始int值作为IntStream。< / p>