问题:
编写后端接口时,碰到一个这样的场景,查询出来的数据,按照其中的某个字段进行分组,转换成了Map。然后需要按照value中的某个值的大小,遍历map的键值对。但是我们都知道默认的HashMap是无序的,entrySet也是无序的,想要用stream的sorted做排序也是做不到的。后来换成了LinkedHashMap,但是entrySet使用sorted方法是没有办法达到效果的。
解决:
其实可以换一个思路,不纠结entrySet的排序,而是直接将查出来的数据,先按排序的值进行排序,然后再按字段分组,转换成LinkedHashMap,此时的LinkedHashMap就保留了顺序,可以直接遍历了。
// 查询模板库集合 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()));
发表评论