一,有一个参数的groupby
第一个参数:按照该参数规则进行分组,规则的结果为整个结果Map的key。
结果形态:Map<String,List<Object>>,Object:根据实际情况显示。结果返回一个Map集合,Map的key是按照该规则执行后返回的每个结果,Map的value是一个List集合,该集合中的值是能满足他能得到对应key的参数规则,但是还未被处理过的对象。
例子(初期化代码在最下面):
Map<String, List<Type>> map = list.stream().collect(groupingBy(Type::getName));
结果name为map的key,List<Type>为map的值。
二,有两个参数的groupby
第一个参数:按照该参数规则进行分组,规则的结果为整个结果Map的key。
第二个参数:是Collector类型,以上面“有一个参数的groupby”的value为基础,
对value进行再次处理,并将结果对象更新成Map的value。
结果形态:Map<String,Object>,Object:根据实际情况显示,结果返回一个Map集合,Map的key是该按照第一个参数的规则执行后返回的每个结果的字符串,Map的value是再次被处理后的的对象。
例子(初期化代码在最下面):
final Map<String, Long> result2 = list.stream()
.collect(Collectors.groupingBy(Type::getName, Collectors.counting()))
结果name为map的key,分组name的个数为map的值({name=2, name2=1})。
三,有三个参数的的groupby
第一个参数:按照该参数规则进行分组,规则的结果为整个结果Map的key。
第二个参数:添加了对结果Map的生成方式,默认是HashMap(即我们要指定返回Map的具体类型,TreeMap,LinkedMap等)
第三个参数:是Collector类型,以上面“有一个参数的groupby”的value为基础,对value进行再次处理,并将结果对象更新成Map的value。
例子(初期化代码在最下面):
final Map<String, Map<String, List<Type>>> result3 = list.stream()
.collect(Collectors.groupingBy(Type::getName, LinkedHashMap::new, Collectors.groupingBy(Type::getAge)));
final Type type1 = new Type();
final Type type2 = new Type();
final Type type3 = new Type();
type1.setAge("11");
type1.setName("name");
type2.setAge("22");
type2.setName("name2");
type3.setAge("22");
type3.setName("name");
final List<Type> list = List.of(type1, type2, type3);
public class Type {
String name;
String age;
public String getName() {
return name;
public void setName(final String name) {
this.name = name;
public String getAge() {
return age;
public void setAge(final String age) {
this.age = age;