簡體   English   中英

Java8 Lambda表達式評估

[英]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中從映射函數創建的第一個元素。 然后它將繼續並添加映射列表中的所有元素,並返回一個包含所有年齡之和的整數。

TL; DR

它匯總了列表中“人員”的所有年齡。


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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM