簡體   English   中英

關於Java Streams中Collector和Function參數排序問題

[英]Question about ordering of parameters of Collector and Function in Java Streams

所以我正在研究 Java 流,我對某些參數的順序的含義有一些疑問。

一些上下文:

public static List<Person> createPeople() {
    return List.of(new Person("Sara", 20), 
                   new Person("Sara", 22), 
                   new Person("Bob", 20), 
                   new Person("Paula",32), 
                   new Person("Paul", 32), 
                   new Person("Jack", 3), 
                   new Person("Jack", 72), 
                   new Person("Jill", 11));
    }
    

List<Person> people = Section.createPeople();

考慮以下代碼:

Map<String, Integer> countByName3 = people.stream()
                                          .collect(groupingBy(Person::getName,
                                                              collectingAndThen(counting(), Long::intValue)));

這段代碼的重點是 output 一個鍵值對,其中鍵是人名,值是具有該特定名稱的人數。

現在,我的理解是,collect 方法將由 Collectors class 中的函數(例如 groupingBy)生成的 Collector 對象作為其參數。

我也了解到其中一些方法的參數中有一個Function。 我感興趣的是 Function 的順序和收集器在生成收集器 object 的方法中所起的作用。

例如,groupingBy() 按順序(函數、收集器)獲取其 arguments,而 collectAndThen() 按順序(收集器、函數)獲取其 arguments。 如果我沒記錯的話,兩者都會返回 Collectors。

因此,顛倒順序的含義是什么,它是否表明某些東西是如何在幕后處理的? 如果訂單背后有差異/含義,我可以得到解釋嗎?

非常感謝。

這里沒有什么神奇的事情發生。 Collectors只是一個 class。 像任何其他人一樣。 它有 static 方法。 你可以調用它們,這里絕對沒有魔法。 如果需要,您可以使用返回Collector類型實例的 static 方法制作自己的 class。

鑒於它們只是方法,語言中絕對沒有關於參數順序的固有內容。 collectingAndThen方法的作者分別對groupingBy方法做出了決定。 就這樣。

如果你想解釋為什么這些作者決定將 arguments 放在這些訂單中,你必須問他們——這對於 Stack Overflow 來說不是一個合適的問題,所以我會給你懷疑的好處,並假設你知道並要求人們就原因發表意見。 這也不太適合 SO。 但是,為了滿足你:

對於我,這說得通。 collectingAndThen的順序與該方法的名稱相同:“創建一個新的收集器,首先應用此收集器(第一個參數),但在收集后應用此完成轉換(第二個參數)”。

arguments 的順序可以解釋它的作用。

groupingBy,做同樣的事情:通過按某個鍵分組創建一個收集器; 要導出此密鑰,請通過轉換 function 將 stream 中的所有東西折騰。 然后,通過使用這個收集器應用這個鍵值來實際收集它。

兩者都處於“如果您要解釋它的作用,請按照您提到參數的順序”順序。 groupingBy的第一個“東西”恰好是Function而它的第二個“東西”恰好是一個Collector ,而collectingAndThen的第一個“東西”是一個Collector ,它的第二個“東西”是一個Function是總計巧合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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