gpt4 book ai didi

java - 在 Stream reduce 方法中,恒等式必须始终为 0 求和和 1 乘法?

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:25 25 4
gpt4 key购买 nike

我继续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。对于顺序流,此代码始终返回 7372 + 1 但对于并行,它始终返回 7672 + 4*1(4 等于流元素数)。

当我看到这个结果时,我觉得并行流和顺序流返回不同的结果很奇怪。

我是不是在什么地方违约了?

附言

对我来说,73 是预期结果,但 76 不是。

最佳答案

身份值是一个值,例如 x op identity = x .这不是 Java 独有的概念 Stream s,例如参见 on Wikipedia .

它列出了一些标识元素的例子,其中一些可以直接用Java代码表示,例如

  • reduce("", String::concat)
  • reduce(true, (a,b) -> a&&b)
  • reduce(false, (a,b) -> a||b)
  • reduce(Collections.emptySet(),
    (a,b)->{ Set<X> s=new HashSet<>(a); s.addAll(b); return s; })
  • reduce(Double.POSITIVE_INFINITY, Math::min)
  • reduce(Double.NEGATIVE_INFINITY, Math::max)

应该清楚表达式 x + y == x任意 x只能在 y==0 时满足,因此 0是加法的标识元素。同样,1是乘法的恒等元。

更复杂的例子是

  • 减少谓词流

    reduce(x->true, Predicate::and)
    reduce(x->false, Predicate::or)
  • 减少函数流

    reduce(Function.identity(), Function::andThen)

关于java - 在 Stream reduce 方法中,恒等式必须始终为 0 求和和 1 乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32866581/

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