[英]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.