3 回答

TA貢獻1725條經驗 獲得超8個贊
在你的兩個例子中
.collect(groupingBy(Dish::getType)); .collect(groupingBy(Dish::getType, mapping(Dish::getName, toList())));
返回值相同,因為您toString()
在Dish
類中的方法name
僅返回。嘗試向toString()
mehtod 添加更多信息,您會看到不同之處。
通常,groupingBy
僅使用分類器允許對對象進行分組,就像在您的第一個示例中一樣。但是goupingBy
與分類器和下游一起使用可以讓您對更多的對象進行分組,而不僅僅是您的對象。例如,您可以按類型對平均卡路里進行分組:
.collect(groupingBy(Dish::getType, averagingInt(Dish::getCalories)); // Map<Type, Double>
或者找到每種類型熱量最高的菜肴:
.collect(groupingBy(Dish::getType, maxBy(Comparator.comparingInt(Dish::getCalories))); // Map<Type, Optional<Dish>>
通常groupingBy
用作雙重分組的下游本身(按類型和是否是素食主義者):
.collect(groupingBy(Dish::getType, groupingBy(Dish::isVegetarian)); // Map<Type, Map<Boolean, List<Dish>>>

TA貢獻2037條經驗 獲得超6個贊
如果這是問題
因為這兩個代碼都產生了相同的結果。一種使用 return groupingBy(classifier, toList()); 并返回 groupingBy(classifier, HashMap::new, 下游); ?
groupingBy(函數分類器,下游收集器)
不保證返回的 Map 的類型、可變性、可序列化性或線程安全性。
groupingBy(功能分類器,供應商mapFactory,下游收集器)
Collector 生成的 Map 是使用提供的工廠函數創建的。
唯一的區別是當您使用groupingBy
時創建mapFactory
的Map
是基于您的供應商邏輯(可能是自定義的、不可變的、同步的等。)

TA貢獻1808條經驗 獲得超4個贊
兩者的基本區別是什么?
主要區別在于您在完成收集器之前的中間步驟中完成的映射。不過,您使用它們的方式不同的是.groupingBy
一方面,您已將mapperanddownstream共同指定為:
.collect(Collectors.groupingBy(Dish::getType, // classifier
Collectors.mapping(Dish::getName, // mapper <<<< difference here
Collectors.toList()))) // downstream
另一方面,的默認實現groupingBy用于
.collect(Collectors.groupingBy(Dish::getType))
可以擴展為類似于以下的某種格式:
.collect(Collectors.groupingBy(Dish::getType, // classifier
Collectors.mapping(Function.identity(), // mapper
Collectors.toList()))); // downstream
添加回答
舉報