码农的世界Java 杂谈金融基础技术与业务

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

2019-08-01  本文已影响4人  就没一个昵称能用

场景

在业务中查出一个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方法有几个重载方法,上面使用的方法有三个参数

上一篇 下一篇

猜你喜欢

热点阅读