我对 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#parallelStream
或Stream#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/