Java8 | 如何使用Group By 聚合操作集合資料?
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現有的方法,在記憶體中轉化資料的格式,能極大的提高開發效率。
少年,沒看夠?點選石頭的詳情介紹,隨便點點看看,說不定有驚喜呢?歡迎支援點贊/關注/評論,有你們的支援是我更文最大的動力,多謝啦!
- 多雲 Vs 混合雲 (一)
- DDD | 領域驅動設計 Vs 微服務
- DDD | 領域驅動設計 Vs 敏捷 Vs 面向物件
- AWS & Azure & GCP 選擇
- 機器是如何學習的?(半監督式學習和其它方式)
- 機器是如何學習的?(非監督式學習)
- 機器是如何學習的?(監督式學習)
- 安全 | 聊聊挖礦哪些事兒(一)
- 機器學習的入門學習資料,建議收藏
- Linux 實用操作彙總(二)
- AWS 日誌監控 Flow Logs Vs CloudTrail Vs CloudWatch
- AWS 日誌監控 CloudTrail Vs CloudWatch
- 面試反殺 | 請談談Java8-18引入的新特性(六)
- 面試反殺 | 請談談Java8-18引入的新特性(四)
- 面試反殺 | 請談談Java8-18引入的新特性(五)
- 面試反殺 | 請談談Java8-18引入的新特性(三)
- 面試反殺 | 請談談Java8-18引入的新特性(二)
- 面試反殺 | 請談談Java8-18引入的新特性(一)
- 什麼是 gRPC? 它比 REST API 好嗎?
- Spring i18n – 國際化資源解析