场景
在业务中查出一个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
- 第三个参数表示分类后,对应的分类的结果如何收集