Java8 | 如何使用Group By 聚合操作集合資料?

語言: CN / TW / HK

theme: scrolls-light

這是我參與11月更文挑戰的第19天,活動詳情檢視:2021最後一次更文挑戰

🤞 個人主頁:@青Cheng序員石頭
🤞 粉絲福利:加粉絲群 一對一問題解答,獲取免費的豐富簡歷模板、提高學習資料等,做好新時代的卷卷王!

上文 《Java8 | 如何優雅地初始化Map & List2Map?》有講到如何初始化Map以及List2Map的方式,有很多小夥伴提了不少優秀的建議,一鼓作氣,繼續寫,坐等小夥伴圍觀。這篇文章就實際開發中很有可能用到的集合資料Group By處理,實踐多種方法解決問題。

一、開發問題

集合資料分組很多在實際開發過程中是相當常見,比如傳給前端的產品資料按照型別進行分組。最常見的方式是遍歷整個集合,然後通過判斷型別構造儲存不同型別的集合。那麼有沒有更好的辦法,Java8 groupingBy能幫到我們。

同樣地, 假如我們有一個類Product,如下面的程式碼所示。 @Getter @Setter @ToString @Builder class Product{ private Long id; private String category; private String name; private int count; } 我們現在獲取到了List<Product>格式的資料。 java static List<Product> getList(){ final List<Product> productList = new ArrayList<>(100); for(int i =1;i<=100;i++){ productList.add(Product.builder() .id((long) i) .name("name"+i) .category("category"+i%9) .count(i) .build()); } return productList; } 接下來我們對這個資料進行一些複雜的處理。

二、最簡單的單列處理

按照category型別進行分組。 java final Map<String, List<Product>> maps = productList.stream() .collect(Collectors.groupingBy(Product::getCategory)); 這裡對於 Collectors.groupingBy的引數 Function<? super T, ? extends K> classifier的返回值作為Key 。

三、分組後統計指定列的總數

按照category型別進行分組,並且統計每個型別的count總數。 Map<String, Integer> maps = productList.stream() .collect(Collectors.groupingBy(Product::getCategory, summingInt(Product::getCount))); 按照上面的程式碼就能得到從分組結果中得到總和。這上面是聚合操作,如果要做篩選操作,比如檢視型別分組下數量最多的產品怎麼做?
maxBy(comparingInt(*))即可。 Map<String, Optional<Product>> maps = productList.stream() .collect(Collectors.groupingBy(Product::getCategory, maxBy(comparingInt(Product::getCount)))); 用這些JDK現有的方法,在記憶體中轉化資料的格式,能極大的提高開發效率。


少年,沒看夠?點選石頭的詳情介紹,隨便點點看看,說不定有驚喜呢?歡迎支援點贊/關注/評論,有你們的支援是我更文最大的動力,多謝啦!