相关文章推荐
威武的登山鞋  ·  Redisson ...·  3 月前    · 
想发财的野马  ·  python zmq socket ...·  1 年前    · 
大鼻子的大熊猫  ·  Is there WebFilter ...·  1 年前    · 

一,有一个参数的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;