jdk8 分組後進行排序
阿新 • • 發佈:2019-02-10
一.概述
預設groupingBy程式碼裡會生成一個HashMap(hashMap是無序的,put的順序與get的順序不一致)
- HashMap是無序的,HashMap在put的時候是根據key的hashcode進行hash然後放入對應的地方。所以在按照一定順序put進HashMap中,然後遍歷出HashMap的順序跟put的順序不同(除非在put的時候key已經按照hashcode排序號了,這種機率非常小)
- 單純的HashMap是無法實現排序的,這的排序是指,我們將鍵值對按照一定的順序put進HashMap裡,然後在進行取鍵值對的操作的時候,是按照put進去的順序把鍵值對取出來的。
- JAVA在JDK1.4以後提供了LinkedHashMap來幫助我們實現了有序的HashMap!LinkedHashMap取鍵值對時,是按照你放入的順序來取的。
二.結果
這就造成了一個List<Model>如果是有序的,在 groupingBy後 model的順序是不可控的.
三.解決
下面是groupingBy的引數說明
可以看到有三個引數,第一個引數就是key的Function
了,第二個引數是一個map工廠,也就是最終結果的容器,一般預設的是採用的HashMap::new
,最後一個引數很重要是一個downstream
,型別是Collector
,也是一個收集器,那就是說,這三個引數其實就是為了解決分組問題的
-
第一個引數:分組按照什麼分類
-
第二個引數:分組最後用什麼容器儲存返回
-
第三個引數:按照第一個引數分類後,對應的分類的結果如何收集
其實一個引數的Collectors.groupingBy
方法的 ,第二個引數預設是HashMap::new
, 第三個引數收集器其實預設是Collectors.toList
圖例:
連續分組加排序:
LinkedHashMap<String,LinkedHashMap<String,List<ProvinceAndCityAndDistrict>>> resMap = target.stream() .collect(Collectors.groupingBy(provinceAndCityAndDistrict::getsProvince,LinkedHashMap::new,Collectors.groupingBy(ProvinceAndCityAndDistrict::getsCity,LinkedHashMap::new,Collectors.toList())));
第一個引數:分組引數,key值
第二個引數:分組後甩什麼容器儲存,指定為lindedHashMap
第三個引數:按照第一個引數分組後,對應的分類結果再次分組,並且最後用list進行收集