1. 程式人生 > >jdk8 分組後進行排序

jdk8 分組後進行排序

   一.概述

 預設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,也是一個收集器,那就是說,這三個引數其實就是為了解決分組問題的

  1. 第一個引數:分組按照什麼分類

  2. 第二個引數:分組最後用什麼容器儲存返回

  3. 第三個引數:按照第一個引數分類後,對應的分類的結果如何收集

其實一個引數的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進行收集