Java 8 流管道性能

标签 java java-8

我对 java-08 中使用 Stream API 的性能增强有一些疑问。 以下是java-06中的代码。

int sum = 0;
    for (int x : numbers) {
       sum += x;
    }

这是java-8中的代码。

 int sum = numbers.stream().reduce(0, (x,y) -> x+y);

或者:

int sum = numbers.stream().reduce(0, Integer::sum);

问题:- 虽然两段代码的行数相同,但内部操作是如何进行的? 这就是它转换为流并并行处理的方式。

最佳答案

首先,您的流不是并行流。您必须调用List#parallelStreamStream#parallel明确地。例如:

int sum = numbers.parallelStream().reduce(0, Integer::sum);

另一种总结 numbers 的方法是 map Stream<Integer>IntStream ,它确实拆箱 N次但是Stream#reduce拆箱吗2 *(N - 1)次和额外的装箱操作(如果流大小 > 2),例如:

int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();

对于“内部运行情况如何?”,您可以看到Eran的回答,据我所知他已经详细描述了并行流。

Stream#reduce 拆箱

1 + 2 + 3 + 4 + 5 的示例约简树如下,拆箱操作次数:N = 10 ( 1(2) + 5(2) + 9(2) + 6(2) + 15(2) ):

// v--- identity
   0      1     2       3     4       5
     1(2)          5(2)          9(2)
            6(2)          9(/)
                  15(2) 
//                ^  ^--- unboxing times, `/` means doesn't reducing at this time
//                |
//                |---  the sum result of current reducing  

关于Java 8 流管道性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45100889/

相关文章:

java - 有哪些不同的 zlib 压缩方法以及如何在 Java 的 Deflater 中强制使用默认值?

java - java 方法如何接受扩展泛型类型的参数

java - 二叉搜索树小计数练习

java - 如何按两个字段排序,其中之一是枚举?

java - 尝试使用多个资源会导致 Sonar qube 问题

java - 我想在我的 jframe 计算器中进行多次计算,例如 2+2+2

java - Lambda 内部或Else获取有界通配符泛型

java - Java中default关键字的作用是什么?

lambda - 带有空值检查的 Java 8 lambda 比较器

functional-programming - 是否可以只迭代一次流并执行 2 次或更多操作?