[英]Java8 Lambda Expressions Evaluation
List <Person> roster = new List<Person>();
Integer totalAgeReduce = roster
.stream()
.map(Person::getAge)
.reduce(
0,
(a, b) -> a + b);
誰能幫我理解上面的代碼片段。 我的理解是,stream方法將首先迭代整個花名冊List
並且在迭代時將創建一個包含每個人年齡的映射對象的新List
。 然后,它將在映射完成后最終調用reduce(僅在映射正確之后才調用reduce嗎?)。 並且在化簡中,它從0開始,並且在新映射列表上的化簡的第一次迭代中, a = 0
和b等於List
中從映射函數創建的第一個元素。 然后它將繼續並添加映射列表中的所有元素,並返回一個包含所有年齡之和的整數。
它匯總了列表中“人員”的所有年齡。
stream()
:從集合(列表)創建流
map()
:將接收到的對象映射到另一個對象(這里是從Person到Integer(getAge返回Integer))
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
流中的每個項目將一次通過所有步驟發送。 以下是一些測試代碼,可幫助您了解發生了什么:
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
事情是
(a, b) -> a + b);
是一個累加器,如果您像遞歸函數那樣看它,它將傳遞總和的結果,對於流中的每個元素,因為Andreas Point out不是列表,而是一個管道。
僅僅指出lambda表達式只是傳遞一個參數,它實際上是一個函數 。
如果要使用循環,它將看起來像這樣:
List<Integer> ages = new ArrayList<>();
for (Person p : roster) {
ages.add(p.getAge());
}
int sum = 0;
for (Integer age : ages) {
sum += age;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.