解决Java8使用groupingBy分组后顺序被改变问题

场景

在业务中查出一个List集合后,需要根据List中对象的某个或某些字段进行分组,但是处理完之后会发现返回的值与当时传入的顺序不一致,有些场景可能我们是需要保证数据顺序一致的

//按品牌名称首字母分组
Map<String, List<Brand>> brandMap = brandList.stream().collect(Collectors.groupingBy(Brand::getFirstLetter));

原因

HashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同(除非在put的时候key已经按照hashcode排序号了,这种几率非常小)
所以单纯的HashMap是无法实现排序的,这里的排序是指,我们将键值对按照一定的顺序put进HashMap里,然后在进行取键值对的操作的时候,是按照put进去的顺序把键值对取出来的,这就造成了一个List如果是有序的,在groupingBy后的顺序是不可控的

解决

LinkedHashMap取键值对时,是按照你放入的顺序来取的

LinkedHashMap<String, List<Brand>> brandMap = brandList.stream().collect(Collectors.groupingBy(Brand::getFirstLetter, LinkedHashMap::new, Collectors.toList()));

groupby方法有几个重载方法,上面使用的方法有三个参数

  • 第一个参数表示分组按照什么进行分类
  • 第二个参数表示分组结果最后用什么容器保存并返回,这里指定为LinkedHashMap
  • 第三个参数表示分类后,对应的分类的结果如何收集
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • hashmap实现的数据结构,数组、桶等。 如图所示 JDK 1.7,是以数组+链表组成的,链表为相同hash的键...
    不需要任何阅读 852评论 0 1
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,292评论 0 16
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,526评论 0 3
  • 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 ...
    城市里永远的学习者阅读 762评论 0 49
  • 原文地址 Java集合 Java集合框架:是一种工具类,就像是一个容器可以存储任意数量的具有共同属性的对象。 Ja...
    gyl_coder阅读 998评论 0 8