stream流的多个条件分组去重
时间: 2025-02-25 16:29:17 浏览: 52
### Java Stream API 实现多条件分组并去重
当处理复杂的数据集时,可以利用 `Stream` 的强大功能来实现基于多个字段的分组和去重操作。下面展示了一个具体的例子,在该实例中,假设有一个包含用户信息的对象列表,并希望按照用户的部门和地区两个属性进行分组,同时去除重复项。
#### 定义实体类 User
为了便于理解,先定义一个简单的 `User` 类作为测试对象:
```java
public class User {
private String id;
private String name;
private String department;
private String region;
// 构造函数, getter 和 setter 方法省略...
}
```
#### 使用 Collectors.groupingBy 进行分组与去重
通过组合使用 `Collectors.groupingBy()` 及自定义比较逻辑可达到目的。这里采用双重分组策略——首先按区域划分,再依据部门进一步细分;每一步都应用过滤器以排除已存在的记录[^1]。
```java
import java.util.*;
import java.util.stream.Collectors;
@Test
public void dis2() {
List<User> users = Arrays.asList(
new User("001", "Alice", "HR", "North"),
new User("002", "Bob", "Engineering", "South"),
new User("003", "Charlie", "HR", "East"),
new User("004", "David", "Marketing", "West"),
new User("005", "Eve", "HR", "North") // Duplicate entry with different ID but same dept and region as Alice.
);
Map<String, Map<String, Optional<User>>> groupedUsers =
users.stream()
.collect(Collectors.groupingBy(
User::getRegion,
Collectors.groupingBy(
User::getDepartment,
Collectors.reducing((existing, current) -> existing))));
// 将嵌套映射转换回扁平化的唯一用户集合
Set<User> uniqueUsers = groupedUsers.values().stream()
.flatMap(deptMap -> deptMap.values().stream())
.map(Optional::orElseThrow)
.collect(Collectors.toSet());
System.out.println(uniqueUsers);
}
```
上述代码片段展示了如何运用流式编程模型中的收集器来进行多层次聚合运算,最终得到既满足指定维度约束又不含冗余条目的目标数据结构。
阅读全文
相关推荐


















