java8 stream groupingBy分组+排序

原创  郑建华   2020-10-20   3099人阅读  1 条评论

问题:

编写后端接口时,碰到一个这样的场景,查询出来的数据,按照其中的某个字段进行分组,转换成了Map。然后需要按照value中的某个值的大小,遍历map的键值对。但是我们都知道默认的HashMap是无序的,entrySet也是无序的,想要用stream的sorted做排序也是做不到的。后来换成了LinkedHashMap,但是entrySet使用sorted方法是没有办法达到效果的。

解决:

其实可以换一个思路,不纠结entrySet的排序,而是直接将查出来的数据,先按排序的值进行排序,然后再按字段分组,转换成LinkedHashMap,此时的LinkedHashMap就保留了顺序,可以直接遍历了。

image.png

// 查询模板库集合
List<QualityCheckTemplateDetail> templateDetailList=qualityCheckTemplateDetailService.list(Wraps.<QualityCheckTemplateDetail>lbQ().eq(QualityCheckTemplateDetail::getTemplateId,templateId));
// 创建 项目dto集合
List<QualityCheckItemSaveDTO> itemDtoList=new ArrayList<QualityCheckItemSaveDTO>();
// 创建 以项目id为key的map
Map<Integer,List<QualityCheckTemplateDetail>> itemMap=new LinkedHashMap<Integer,List<QualityCheckTemplateDetail>>();
// 遍历 模板明细集合
itemMap=Optional.ofNullable(templateDetailList).orElse(new ArrayList<QualityCheckTemplateDetail>()).stream()
        .sorted((o1, o2) -> o1.getItemOrder()-o2.getItemOrder())
        .collect(Collectors.groupingBy(QualityCheckTemplateDetail::getItemId,LinkedHashMap::new,Collectors.toList()));

本文地址:https://www.zjh336.cn/?id=1998
版权声明:本文为原创文章,版权归 郑建华 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

 评论列表

  1. 访客
    访客 【实习生】  @回复

    学到了,是个办法!