3 回答
TA贡献1725条经验 获得超7个赞
在你的两个例子中
.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
添加回答
举报