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

adr*_*mir 18 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);
Run Code Online (Sandbox Code Playgroud)

因此,在第一种情况下,我使用reduce来对值进行求和,因此BinaryOperator函数将始终接收int(acc)和Integer(集合的当前元素),然后将对整数进行取消装箱int(acc + e)

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

我的问题是,第二种方法有什么优势吗?当我可以使用地图时,对于int的地图有什么意义呢?

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

问候,

Ian*_*rts 27

还有一个额外的拳击水平

int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue();
Run Code Online (Sandbox Code Playgroud)

因为缩减函数是BinaryOperator<Integer>- 它传递两个Integer值,取消它们,添加它们,然后重新打包结果.该mapToInt版本Integer从列表中取消一次元素,然后使用int该点上的原始值作为IntStream.

  • +1.当在地图之后链接更多操作(过滤,缩小,其他变换)时,这将更加重要,这将需要取消装箱然后重新装箱. (3认同)