Java8 Lambda表达式求值

Java8 Lambda表达式求值,java,lambda,mapreduce,java-8,Java,Lambda,Mapreduce,Java 8,有人能帮我理解上面的代码片段吗。我的理解是,stream方法将首先遍历整个花名册列表,当它进行迭代时,它将创建一个包含每个人年龄的映射对象的新列表。然后,在映射完成后,它将最终调用reduce。只有在映射正确?之后,才会在末尾调用reduce?。在reduce中,它从0开始,在reduce对新映射列表的第一次迭代中,a=0,b等于从映射函数创建的列表中的第一个元素。然后,它将继续添加映射列表中的所有元素,并返回一个包含所有年龄总和的整数。TL;博士 它将列表中的人的所有年龄相加 流:从集合列表创

有人能帮我理解上面的代码片段吗。我的理解是,stream方法将首先遍历整个花名册列表,当它进行迭代时,它将创建一个包含每个人年龄的映射对象的新列表。然后,在映射完成后,它将最终调用reduce。只有在映射正确?之后,才会在末尾调用reduce?。在reduce中,它从0开始,在reduce对新映射列表的第一次迭代中,a=0,b等于从映射函数创建的列表中的第一个元素。然后,它将继续添加映射列表中的所有元素,并返回一个包含所有年龄总和的整数。

TL;博士 它将列表中的人的所有年龄相加

流:从集合列表创建流

map:将从接收到的对象映射到另一个对象此处从Person到Integer getAge返回一个整数

reduce0,a,b->a+b:reduce是一个reduce,它将接收到的所有对象减少为一个,这里的操作是将它们全部添加到一起,一个大的添加。它以identity first值作为第一个参数,下面的lambda表达式BinaryOperator或BiFunction提供了应用于缩减的逻辑

实例 TL;博士 它将列表中的人的所有年龄相加

流:从集合列表创建流

map:将从接收到的对象映射到另一个对象此处从Person到Integer getAge返回一个整数

reduce0,a,b->a+b:reduce是一个reduce,它将接收到的所有对象减少为一个,这里的操作是将它们全部添加到一起,一个大的添加。它以identity first值作为第一个参数,下面的lambda表达式BinaryOperator或BiFunction提供了应用于缩减的逻辑

实例 问题是

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
是一个累加器,如果你把它看作一个递归函数,它将传递求和的结果,因为流中的每个元素,正如Andreas指出的,都不是一个列表,而是一个管道

我要指出的是,lambda表达式只是传递了一个实参,而实参实际上是一个函数

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
是一个累加器,如果你把它看作一个递归函数,它将传递求和的结果,因为流中的每个元素,正如Andreas指出的,都不是一个列表,而是一个管道


要指出的是,lambda表达式只是传递了一个参数,实际上它是一个函数。

流中的每个项都将通过所有步骤一次发送一个。下面是一些测试代码,帮助您了解发生了什么:

 (a, b) -> a + b);

流中的每个项目都将通过所有步骤一次发送一个。下面是一些测试代码,帮助您了解发生了什么:

 (a, b) -> a + b);

如果要使用循环,它将如下所示:

1 A
2 A
3 A
1 B
2 B
3 B
END: AB

如果要使用循环,它将如下所示:

1 A
2 A
3 A
1 B
2 B
3 B
END: AB

基本正确,但:1与l变量相同?-2流和映射不创建新列表。从逻辑上讲,你可能会这样想,但更好的方式是管道。流将元素沿管道向下发送。在管道的连接处,贴图将年龄从对象中剥离出来,并将其沿管道而不是原始对象发送。reduce然后将所有年龄压缩为一个值,如所提供的lambda所定义。编写int totalAge=floster.stream.mapToIntPerson::getAge.sum似乎是一种复杂的方法;基本正确,但:1与l变量相同?-2流和映射不创建新列表。从逻辑上讲,你可能会这样想,但更好的方式是管道。流将元素沿管道向下发送。在管道的连接处,贴图将年龄从对象中剥离出来,并将其沿管道而不是原始对象发送。reduce然后将所有年龄压缩为一个值,如所提供的lambda所定义。编写int totalAge=floster.stream.mapToIntPerson::getAge.sum似乎是一种复杂的方法;lambda表达式的主体中是否需要返回语句?就像在reduce中一样,你需要返回acc+s还是只写acc+s?你只需要在作用域{}中输入一个返回。否则,它假定单个语句的结果就是结果。我想为println添加一个额外的命令,所以我必须指出我想要返回的值。为了形式正确,form param->expression不需要返回语句,但只有少数语句(如方法调用)也是表达式。所有其他语句,如if、try或loops,始终需要param->{statements}语法,因此如果需要值,则需要返回语句。顺便说一句,您可以使用Stream.ofA,B来创建两个元素的流……lambda表达式的主体中是否需要返回语句?就像在reduce中一样,你需要返回acc+s还是只写acc+s?如果你输入
作用域{}。否则,它假定单个语句的结果就是结果。我想为println添加一个额外的命令,所以我必须指出我想要返回的值。为了形式正确,form param->expression不需要返回语句,但只有少数语句(如方法调用)也是表达式。所有其他语句,如if、try或loops,始终需要param->{statements}语法,因此如果需要值,则需要返回语句。顺便说一下,您可以使用Stream.ofA,B创建一个两元素流…