Collectors.groupingBy分組後的排序問題

 

默認groupingBy代碼裏會生成一個HashMap(hashMap是無序的,put的順序與get的順序不一致)spa

  • 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的順序是不可控的.code

 

如今遇到這樣一個場景排序

在CMS裏,每一個頁面的模塊是按順序排放的,每一個模塊的內容也是按順序的如 get

List<Model> list=Arrays.asList(m1,m2,m3)hash

如今須要對裏面的元素分組,可是分組後的順序也必須是 m1,m2,m3...中間能夠缺乏,可是不能亂序io

如下是合法的 m1,m3  或者  m2,m3 可是不能 m3,m2class

如如下代碼 list的順序是  id=2的在 id=1以前, 分組以後的訪問也必須是id=2的在前纔對容器

可是若是調用 默認的分組,就會發現 id=1的在前了 (在後的將要在前;在前的將要在後了)stream

 

輸出老是List

1

[A12,A11]

2

[A2,A21]

可是指望輸出爲

2 [A21,A2]    1 [A12,A11]

若是須要保持排序就不能使用默認的 方法了,必須使用 被註釋的方法 (明確使用LinkedHashMap來保持順序).

 

下面是groupingBy的參數說明

 

 

能夠看到有三個參數,第一個參數就是key的Function了,第二個參數是一個map工廠,也就是最終結果的容器,通常默認的是採用的HashMap::new,最後一個參數很重要是一個downstream,類型是Collector,也是一個收集器,那就是說,這三個參數其實就是爲了解決分組問題的

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

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

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

 

其實一個參數的Collectors.groupingBy方法的 ,第二個參數默認是HashMap::new, 第三個參數收集器其實默認是Collectors.toList

相關文章
相關標籤/搜索