場景
在業(yè)務(wù)中查出一個List集合后,需要根據(jù)List中對象的某個或某些字段進(jìn)行分組,但是處理完之后會發(fā)現(xiàn)返回的值與當(dāng)時傳入的順序不一致,有些場景可能我們是需要保證數(shù)據(jù)順序一致的
//按品牌名稱首字母分組
Map<String, List<Brand>> brandMap = brandList.stream().collect(Collectors.groupingBy(Brand::getFirstLetter));
原因
HashMap是無序的宵喂,HashMap在put的時候是根據(jù)key的hashcode進(jìn)行hash然后放入對應(yīng)的地方。所以在按照一定順序put進(jìn)HashMap中会傲,然后遍歷出HashMap的順序跟put的順序不同(除非在put的時候key已經(jīng)按照hashcode排序號了锅棕,這種幾率非常小)
所以單純的HashMap是無法實現(xiàn)排序的淌山,這里的排序是指哲戚,我們將鍵值對按照一定的順序put進(jìn)HashMap里,然后在進(jìn)行取鍵值對的操作的時候艾岂,是按照put進(jìn)去的順序把鍵值對取出來的,這就造成了一個List如果是有序的朋其,在groupingBy后的順序是不可控的
解決
LinkedHashMap取鍵值對時王浴,是按照你放入的順序來取的
LinkedHashMap<String, List<Brand>> brandMap = brandList.stream().collect(Collectors.groupingBy(Brand::getFirstLetter, LinkedHashMap::new, Collectors.toList()));
groupby方法有幾個重載方法脆炎,上面使用的方法有三個參數(shù)
- 第一個參數(shù)表示分組按照什么進(jìn)行分類
- 第二個參數(shù)表示分組結(jié)果最后用什么容器保存并返回,這里指定為LinkedHashMap
- 第三個參數(shù)表示分類后氓辣,對應(yīng)的分類的結(jié)果如何收集