【发布时间】:2015-12-28 06:26:11
【问题描述】:
我继续学习 java 8。
我发现了一个有趣的行为:
让我们看看代码示例:
// identity value and accumulator and combiner
Integer summaryAge = Person.getPersons().stream()
//.parallel() //will return surprising result
.reduce(1,
(intermediateResult, p) -> intermediateResult + p.age,
(ir1, ir2) -> ir1 + ir2);
System.out.println(summaryAge);
和模型类:
public class Person {
String name;
Integer age;
///...
public static Collection<Person> getPersons() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Vasya", 12));
persons.add(new Person("Petya", 32));
persons.add(new Person("Serj", 10));
persons.add(new Person("Onotole", 18));
return persons;
}
}
12+32+10+18 = 72。对于顺序流,此代码始终返回73,即72 + 1,但对于并行,它始终返回76,即72 + 4*1(4 等于流元素计数)。
当我看到这个结果时,我认为并行流和顺序流返回不同的结果很奇怪。
我是不是在什么地方违约了?
附言
对我来说,73 是预期结果,但 76 不是。
【问题讨论】:
-
@RealSkeptic 随时纠正我的标题
-
@RealSkeptic 我的乘法大约是 1,总和大约是 0
标签: java java-8 java-stream reduce