Java8 groupBy集合分组 详解Java8的groupBy实现集合的分组

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Java8 groupBy集合分组 详解Java8的groupBy实现集合的分组

kris999   2021-03-17 我要评论
想了解详解Java8的groupBy实现集合的分组的相关内容吗,kris999在本文为您仔细讲解Java8 groupBy集合分组的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java8,groupBy集合分组,Java8,groupBy,下面大家一起来学习吧。

场景:

Java8的groupBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map

1.对集合按照单个属性分组

e.g. 按照skuId分组

Map<String, List<EntryDeliveryDetailywk>> detailsMap01 = dtos1.stream()
.collect(Collectors.groupingBy(EntryDeliveryDetailywk::getskuId));

2对集合按照多个属性分组

solution 1 多个属性拼接出一个组合属性

将多个字段拼接成一个新字段,在使用Java8的groupBy进行分组

Map<String, List<EntryDeliveryDetailywk>> detailmap = details.stream()
.collect(Collectors.groupingBy(d -> fetchGroupKey(d) ));

private String fetchGroupKey(EntryDeliveryDetailywk detail){
  return detail.getSkuId().toString() 
  + detail.getItemsName() 
  + detail.getWarehouseId().toString() 
  + detail.getSupplierId().toString();
 }

solution 2 造静态内部类

在集合元素类里构造静态内部类(成员变量即分组的对应多个属性)

e.g.

//静态内部类
class Person {
 public static class NameAge {
  public NameAge(String name, int age) {
   ...
  }

  // 注意 重写方法 must implement equals and hash function
 }

 public NameAge getNameAge() {
  return new NameAge(name, age);
 }
}

//分组
Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));

solution 3 嵌套调用Java8 groupby

注意得到也是嵌套map

Map<String, Map<Integer, List<Person>>> map = people
 .collect(Collectors.groupingBy(Person::getName,
  Collectors.groupingBy(Person::getAge));

//调用
map.get("Fred").get(18);

参考
https://stackoverflow.com/questions/28342814/group-by-multiple-field-names-in-java-8

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们