默認(rèn)groupingBy代碼里會(huì)生成一個(gè)HashMap(hashMap是無(wú)序的,put的順序與get的順序不一致)
HashMap是無(wú)序的,HashMap在put的時(shí)候是根據(jù)key的hashcode進(jìn)行hash然后放入對(duì)應(yīng)的地方。所以在按照一定順序put進(jìn)HashMap中,然后遍歷出HashMap的順序跟put的順序不同(除非在put的時(shí)候key已經(jīng)按照hashcode排序號(hào)了,這種幾率非常小)
單純的HashMap是無(wú)法實(shí)現(xiàn)排序的,這的排序是指,我們將鍵值對(duì)按照一定的順序put進(jìn)HashMap里,然后在進(jìn)行取鍵值對(duì)的操作的時(shí)候,是按照put進(jìn)去的順序把鍵值對(duì)取出來(lái)的。
JAVA在JDK1.4以后提供了LinkedHashMap來(lái)幫助我們實(shí)現(xiàn)了有序的HashMap!LinkedHashMap取鍵值對(duì)時(shí),是按照你放入的順序來(lái)取的。
這就造成了一個(gè)List<Model>如果是有序的,在 groupingBy后 model的順序是不可控的.
現(xiàn)在遇到這樣一個(gè)場(chǎng)景
在CMS里,每個(gè)頁(yè)面的模塊是按順序排放的,每個(gè)模塊的內(nèi)容也是按順序的如
List<Model> list=Arrays.asList(m1,m2,m3)
現(xiàn)在需要對(duì)里面的元素分組,但是分組后的順序也必須是 m1,m2,m3...中間可以缺少,但是不能亂序
以下是合法的 m1,m3 或者 m2,m3 但是不能 m3,m2
如以下代碼 list的順序是 id=2的在 id=1之前, 分組之后的訪問(wèn)也必須是id=2的在前才對(duì)
但是如果調(diào)用 默認(rèn)的分組,就會(huì)發(fā)現(xiàn) id=1的在前了 (在后的將要在前;在前的將要在后了)
輸出總是
1
[A12,A11]
2
[A2,A21]
但是期望輸出為
2 [A21,A2] 1 [A12,A11]
如果需要保持排序就不能使用默認(rèn)的 方法了,必須使用 被注釋的方法 (明確使用LinkedHashMap來(lái)保持順序).
下面是groupingBy的參數(shù)說(shuō)明
可以看到有三個(gè)參數(shù),第一個(gè)參數(shù)就是key的Function了,第二個(gè)參數(shù)是一個(gè)map工廠,也就是最終結(jié)果的容器,一般默認(rèn)的是采用的HashMap::new,最后一個(gè)參數(shù)很重要是一個(gè)downstream,類(lèi)型是Collector,也是一個(gè)收集器,那就是說(shuō),這三個(gè)參數(shù)其實(shí)就是為了解決分組問(wèn)題的
第一個(gè)參數(shù):分組按照什么分類(lèi)
第二個(gè)參數(shù):分組最后用什么容器保存返回
第三個(gè)參數(shù):按照第一個(gè)參數(shù)分類(lèi)后,對(duì)應(yīng)的分類(lèi)的結(jié)果如何收集
其實(shí)一個(gè)參數(shù)的Collectors.groupingBy方法的 ,第二個(gè)參數(shù)默認(rèn)是HashMap::new, 第三個(gè)參數(shù)收集器其實(shí)默認(rèn)是Collectors.toList
案例:list.stream().collect(Collectors.groupingBy(類(lèi)::字段名, LinkedHashMap::new, Collectors.toList()));
還可以看看
其他文章,謝謝您的閱讀。
網(wǎng)站申明:系本文編輯轉(zhuǎn)載,來(lái)源于網(wǎng)絡(luò),目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),所有權(quán)歸屬原作者。如內(nèi)容、圖片有任何版權(quán)問(wèn)題,請(qǐng)
聯(lián)系我們刪除。