Java中的stream流分組示例詳解
什么是stream流
Java 8引入的Stream API是處理集合數(shù)據(jù)的一種全新方式,它代表了對數(shù)據(jù)元素序列進行函數(shù)式操作的抽象。Stream不是數(shù)據(jù)結(jié)構(gòu),而是一種高級的數(shù)據(jù)處理工具,允許你以聲明式的方式處理數(shù)據(jù)集合,類似于SQL語句操作數(shù)據(jù)庫。
Stream的核心特點:
- 聲明式編程:只需說明"做什么"而非"如何做",代碼更簡潔易讀
- 函數(shù)式風格:與Lambda表達式完美結(jié)合,操作更靈活
- 管道操作:多個操作可以連接起來形成數(shù)據(jù)處理流水線
- 內(nèi)部迭代:不同于集合的外部迭代(使用for-each),Stream在內(nèi)部處理迭代過程
- 延遲執(zhí)行:中間操作不會立即執(zhí)行,只有遇到終結(jié)操作才會觸發(fā)計算
- 不可復用:一個Stream只能被消費一次
1、根據(jù)某個字段分組
// 按 department 字段分組
Map<String, List<User>> groupedByDept = users.stream()
.collect(Collectors.groupingBy(User::getDepartment));2、按多個字段分組(組合分組)
1、方法一:使用 String 拼接作為分組 key(簡單但不夠靈活)
Map<String, List<User>> grouped = users.stream()
.collect(Collectors.groupingBy(
user -> user.getDepartment() + "-" + user.getJobTitle()
));2、使用 Map.Entry(Java 8+ 就支持):
Map<Map.Entry<String, String>, List<User>> grouped = users.stream()
.collect(Collectors.groupingBy(
user -> Map.entry(user.getDepartment(), user.getJobTitle())
)); 這樣 key 是一個 Map.Entry<部門, 職位>,可以唯一確定一個組合
3、使用 record(Java 16+):
// 定義一個記錄類作為分組 key
record DeptJobKey(String department, String jobTitle) {}
Map<DeptJobKey, List<User>> grouped = users.stream()
.collect(Collectors.groupingBy(
user -> new DeptJobKey(user.getDepartment(), user.getJobTitle())
));3、分組后獲取其他統(tǒng)計信息
1、分組后統(tǒng)計每組的數(shù)量
Map<String, Long> countByDept = users.stream()
.collect(Collectors.groupingBy(
User::getDepartment,
Collectors.counting() // 統(tǒng)計每個部門的用戶數(shù)
));
2、分組后獲取每組中的某個屬性集合,比如所有部門下的用戶名
Map<String, List<String>> namesByDept = users.stream()
.collect(Collectors.groupingBy(
User::getDepartment,
Collectors.mapping(User::getName, Collectors.toList()) // 只提取 name 字段
));
3、分組后求每組的某個屬性的最大值 / 最小值 / 平均值
Map<String, Optional<Integer>> maxAgeByDept = users.stream()
.collect(Collectors.groupingBy(
User::getDepartment,
Collectors.mapping(User::getAge, Collectors.maxBy(Comparator.naturalOrder()))
));
// 或者更直觀地使用 Collectors.maxBy / averagingInt 等
//或者使用 Collectors.summarizingInt 做綜合統(tǒng)計
Map<String, IntSummaryStatistics> ageStatsByDept = users.stream()
.collect(Collectors.groupingBy(
User::getDepartment,
Collectors.summarizingInt(User::getAge) // 統(tǒng)計年齡:count, sum, min, max, avg
));4、自定義分組key
Map<String, List<User>> collect = javaList.stream().collect(Collectors.groupingBy(user -> {
String id = user.getId();
return (StringUtils.isEmpty(id)) ? "empty" : "notEmpty"; // 如果為 null,返回empty,不為空notEmpty
}));到此這篇關于Java的stream流分組的文章就介紹到這了,更多相關Java stream流分組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中NoClassDefFoundError異常的原因及解決方法
在 Java 開發(fā)中,java.lang.NoClassDefFoundError 是運行時異常中最常見的問題之一,它通常出現(xiàn)在程序編譯成功后,卻在運行時因 JVM 無法找到某個類的定義 而拋出,本文給大家介紹了Java中NoClassDefFoundError異常的原因及解決方法,需要的朋友可以參考下2025-05-05
controller接口跳轉(zhuǎn)到另一個controller接口的實現(xiàn)
這篇文章主要介紹了controller接口跳轉(zhuǎn)到另一個controller接口的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java求素數(shù)和最大公約數(shù)的簡單代碼示例
這篇文章主要介紹了Java求素數(shù)和最大公約數(shù)的簡單代碼示例,其中作者創(chuàng)建的Fraction類可以用來進行各種分數(shù)運算,需要的朋友可以參考下2015-09-09
springboot整合mybatis-plus實現(xiàn)多表分頁查詢的示例代碼
這篇文章主要介紹了springboot整合mybatis-plus實現(xiàn)多表分頁查詢的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
淺談Spring Data如何簡化數(shù)據(jù)操作的方法
這篇文章主要介紹了看Spring Data如何簡化數(shù)據(jù)操作的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04

