所以我正在研究 Java Streams 并且我對某些引數的順序的含義有一些疑問。
一些背景關系:
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)));
這段代碼的重點是輸出一個鍵值對,其中鍵是人名,值是具有該特定姓名的人數。
現在我的理解是,collect 方法將 Collectors 類中的函式生成的 Collector 物件(例如 groupingBy)作為其引數。
我也明白其中一些方法的引數中有一個Function。我感興趣的是函式和收集器在生成收集器物件的方法中的順序所扮演的角色。
例如, groupingBy() 按順序 (Function, Collector) 獲取引數,而 collectAndThen() 按順序 (Collector, Function) 獲取引數。如果我沒記錯的話,兩者都回傳收藏家。
因此,顛倒順序的含義是什么,它是否表示某些東西是如何在引擎蓋下處理的?如果訂單背后存在差異/含義,我能得到解釋嗎?
非常感謝。
uj5u.com熱心網友回復:
這里沒有任何魔法發生。Collectors是只是一個類。像任何其他人一樣。它有靜態方法。你可以呼叫它們,這里絕對沒有魔法。如果需要,您可以使用回傳Collector型別實體的靜態方法創建自己的類。
鑒于它們只是方法,語言中絕對沒有關于引數順序的固有內容。collectingAndThen方法的作者分別對groupingBy方法做出了決定。就這樣。
如果您想解釋為什么這些作者決定將引數按這些順序排列,您必須問他們 - 這對于 Stack Overflow 來說不是一個合適的問題,所以我會給您懷疑的好處,并假設您知道這一點并要求人們就原因發表意見。這也不太適合 SO。但是,讓你放縱一下:
對于我,這說得通。collectingAndThen與該方法的名稱順序相同:“創建一個新的收集器,該收集器通過首先應用此收集器(第一個引數)進行操作,但在收集后應用此完成轉換(第二個引數)”。
引數的順序是人們會解釋它的作用。
groupingBy,做完全一樣的事情:通過按某個鍵分組來創建一個收集器;為了匯出這個密鑰,通過這個轉換函式把流中的所有東西都扔掉。然后,通過使用此收集器應用此鍵值來實際收集所有內容。
兩者都在這個“按照你提到引數的順序,如果你要解釋它做什么”的順序。這一事實groupingBy的第一個‘東西’恰好是一個Function和它的第二個‘東西’恰好是一個Collector,而對于collectingAndThen有它的第一個‘東西’是Collector其第二個‘東西’是一個Function為總巧合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/393620.html
