stream流对集合做分组
时间: 2025-05-26 13:28:50 浏览: 14
### 使用 Java Stream API 对集合进行分组操作
Java Stream API 提供了 `Collectors` 类来简化复杂的集合操作,其中包括分组和分区的功能。为了对集合中的元素按特定属性进行分组,可以使用 `groupingBy` 方法。
#### 按照单个字段分组
当需要依据对象的一个具体属性来进行分类时,比如用户的年龄,可以直接传递该属性对应的获取器方法给 `groupingBy` 函数作为参数:
```java
import java.util.*;
import java.util.stream.Collectors;
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
public class GroupExample {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("Alice", 30),
new User("Bob", 25),
new User("Charlie", 30)
);
// 按照年龄分组
Map<Integer, List<User>> groupedUsers = users.stream()
.collect(Collectors.groupingBy(User::getAge));
System.out.println(groupedUsers);
}
}
```
这段代码会创建一个映射表,其中键是不同的年龄段,而值则是属于同一岁数的所有用户列表[^1]。
#### 多级分组
如果想要基于多个标准进一步细分数据集,则可以在 `groupingBy` 中嵌套另一个 `Collector` 实现多层分组效果。例如先按部门再按职位级别划分员工信息:
```java
// 假设有一个Employee类包含了department和positionLevel两个成员变量...
Map<String, Map<Integer, List<Employee>>> multiLevelGroup =
employees.stream().collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.groupingBy(Employee::getPositionLevel)));
```
这里构建了一个双重映射结构,外层是以部门名称为key的地图,内层则存储着对应于各个职级下的雇员名单[^4]。
#### 条件性分隔 (Partitioning)
除了普通的分组之外,有时也需要根据某个布尔表达式的结果将元素分成两部分——满足条件的一方与不满足另一方。这时就可以采用 `partitioningBy` 收集器完成这项工作:
```java
List<User> userList = ... ; // 初始化一些用户数据
Map<Boolean, List<User>> partitionedByAge = userList.stream()
.collect(Collectors.partitioningBy(user -> user.getAge()>50));
System.out.println(partitionedByAge);
```
上述例子展示了如何把所有超过五十岁的用户单独挑出来形成一个新的子集[^3]。
通过以上几种方式,能够轻松地运用 Java Streams 进行高效的集合管理,并且保持较高的代码质量。
阅读全文
相关推荐


















