List <Person> roster = new List<Person>();
Integer totalAgeReduce = roster
.stream()
.map(Person::getAge)
.reduce(
0,
(a, b) -> a + b);
任何人都可以帮助我理解上面的代码段。我的理解是,stream方法将首先遍历整个名单List
,并且在迭代时,它将创建一个新的List
映射对象,其中包含每个人的年龄。然后它会在映射完成后最终调用reduce(reduce只在映射正确后才调用?)。并且在reduce中它从0开始,并且在新映射列表a = 0
上的reduce的第一次迭代中,b等于从映射函数创建的List
中的第一个元素。然后它将继续并添加映射列表中的所有元素,并返回一个整数,其中包含所有年龄的总和。
答案 0 :(得分:3)
它汇总了列表中人员的所有年龄。
stream()
:从Collection(List)
map()
:将从接收到的对象到另一个对象(这里从Person到Integer(getAge返回一个整数))进行映射。
reduce(0,(a, b) -> a + b)
:reduce
是一个缩减(它将收到的所有对象减少为一个(这里的动作是将它们全部加在一起,这是一个很大的补充)。它需要身份(第一个值为作为第一个参数开头,以下lambda表达式(BinaryOperator<Integer>
或BiFunction<Integer, Integer, Integer>
)表示申请减少的逻辑。
List<Person> persons = Arrays.asList(new Person("John", 20),
new Person("Mike", 40),
new Person("Wayne", 30));
Integer totalAgeReduce = roster.stream()
.map(Person::getAge)
.reduce(0,(a, b) -> a + b);
System.out.println(totalAgeReduce); // 90
答案 1 :(得分:3)
流中的每个项目将逐个通过所有步骤发送。这里有一些测试代码可以帮助您了解最新情况:
List<String> test = Arrays.asList("A","B");
System.out.println("END: " + test.stream()
.map(s -> {System.out.println("1 " + s); return s; })
.map(s -> {System.out.println("2 " + s); return s; })
.reduce("", (acc, s) -> {System.out.println("3 " + s); return acc + s; })
);
输出
1 A
2 A
3 A
1 B
2 B
3 B
END: AB
答案 2 :(得分:1)
事情是
(a, b) -> a + b);
是一个累加器,如果你像递归函数那样看它,它会传递和的结果,对于流中的每个元素,因为Andreas Point out不是列表,是一个管道。
只是指出 lambda表达式只是传递一个实际上是函数的Argument。
答案 3 :(得分:0)
如果要使用循环,它将看起来像这样:
List<Integer> ages = new ArrayList<>();
for (Person p : roster) {
ages.add(p.getAge());
}
int sum = 0;
for (Integer age : ages) {
sum += age;
}