gpt4 book ai didi

java - reduce() 方法在 Java 8 中是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 20:45:26 26 4
gpt4 key购买 nike

我试图了解 reduce() 方法在 中是如何工作的.

例如我有这个代码:

public class App {

public static void main(String[] args) {
String[] arr = {"lorem", "ipsum", "sit", "amet"};
List<String> strs = Arrays.asList(arr);

int ijk = strs.stream().reduce(0,
(a, b) -> {
System.out.println("Accumulator, a = " + a + ", b = " + b);
return a + b.length();
},
(a, b) -> {
System.out.println("Combiner");
return a * b;
});
System.out.println(ijk);
}
}

输出是这样的:

Accumulator, a = 0, b = lorem
Accumulator, a = 5, b = ipsum
Accumulator, a = 10, b = sit
Accumulator, a = 13, b = amet
17

它是这些字符串长度的总和。而且我看到没有访问组合器,所以它不会乘以数字,它只会添加数字。

但如果我将 stream 替换为 parallelStream:

int ijk = strs.parallelStream().reduce(0, 
(a, b) -> {
System.out.println("Accumulator, a = " + a + ", b = " + b);
return a + b.length();
},
(a, b) -> {
System.out.println("Combiner");
return a * b;
});

System.out.println(ijk);

这是输出:

Accumulator, a = 0, b = ipsum
Accumulator, a = 0, b = lorem
Accumulator, a = 0, b = sit
Combiner
Accumulator, a = 0, b = amet
Combiner
Combiner
300

我看到累加器和组合器都被访问了,但只有乘法是返回的。那么总和会发生什么?

最佳答案

您应该阅读 reduce 的文档:

Additionally, the combiner function must be compatible with the accumulator function; for all u and t, the following must hold:

combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)

在您的情况下,您违反了该法律(在 accumulator 中执行 sum 并在 combiner 中执行 multiplication>),因此您看到的此类操作的结果实际上是未定义的,并且取决于底层源的 Spliterator 是如何实现的(不要那样做!)。

此外,combiner 用于并行流。

当然,您的整个方法可以简化为:

Arrays.asList("lorem", "ipsum", "sit", "amet")
.stream()
.mapToInt(String::length)
.sum();

如果您这样做只是为了学习目的,正确的 reduce 将是(获取 sum):

strs.parallelStream()
.reduce(0,
(a, b) -> {
System.out.println("Accumulator, a = " + a + ", b = " + b);
return a + b.length();
},
(a, b) -> {
System.out.println("Combiner");
return a + b;
});

关于java - reduce() 方法在 Java 8 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55970149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com