Java8 Lambda表达式评估

时间:2016-04-01 23:02:08

标签: java lambda mapreduce java-8

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中的第一个元素。然后它将继续并添加映射列表中的所有元素,并返回一个整数,其中包含所有年龄的总和。

4 个答案:

答案 0 :(得分:3)

TL; DR

它汇总了列表中人员的所有年龄。

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;
}