Java stream 分组
时间: 2024-08-17 22:00:33 浏览: 57
Java Stream API 提供了一个强大的功能,即分组(Grouping)。分组允许你在集合上按照某个键(Key)对元素进行分类,然后对每个分组应用聚合操作。`Stream` 的 `collect()` 方法配合 `Collectors.groupingBy()` 或 `Collectors.partitioningBy()` 等函数可以用于这个目的。
例如,如果你有一个学生列表,你可以按年龄将他们分组:
```java
List<Student> students = ...;
Map<Integer, List<Student>> ageGroups = students.stream()
.collect(Collectors.groupingBy(Student::getAge));
```
这里,`ageGroups` 就是一个 Map,键是学生的年龄,值是对应年龄的学生列表。
对于 `partitioningBy()`,它可以返回两个独立的流,一个包含满足给定断言的元素,另一个包含不满足的元素:
```java
Map<Boolean, List<Student>> hasPassedTest = students.stream()
.collect(Collectors.partitioningBy(student -> student.hasPassedTest()));
```
这会给你一个布尔值对应的流,真表示通过测试的学生,假表示未通过测试的学生。
相关问题
java stream 分组
Java 8 中的 Stream API 提供了一个非常方便的方法来对集合中的元素进行分组。
可以使用 `Collectors.groupingBy()` 方法来实现分组操作。该方法接收一个 Function 作为参数,该函数将每个元素映射到一个键值,然后返回一个 Map,其中键是映射结果,值是对应的元素列表。
例如,假设有一个包含员工对象的列表,可以按照员工的部门进行分组,代码如下:
```
List<Employee> employees = ...;
Map<String, List<Employee>> employeesByDepartment = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
```
在上面的代码中,`Employee::getDepartment` 是一个方法引用,它将每个员工对象映射到其所属的部门。`Collectors.groupingBy()` 方法将按照部门将员工对象分组,并返回一个 `Map<String, List<Employee>>` 类型的结果。
注意,`groupingBy()` 方法还可以接收一个第二个参数,该参数指定了分组后每个组中元素的类型。例如,可以将上面的示例代码修改为以下形式:
```
Map<String, Set<Employee>> employeesByDepartment = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment, Collectors.toSet()));
```
在这个例子中,我们将使用 `Collectors.toSet()` 方法来指定每个组中元素的类型为集合,而不是列表。
java stream分组
Java Stream的分组功能是通过Collectors.groupingBy()方法来实现的。该方法会根据给定的分组条件,将流中的元素分为不同的组,并返回一个Map对象,其中Key为分组条件,Value为对应的分组结果。例如,对于一组数字,可以根据它们的奇偶性来分组,代码如下:
```
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
Map<Boolean, List<Integer>> groups = numbers.stream()
.collect(Collectors.groupingBy(n -> n % 2 == 0));
System.out.println(groups);
// Output: {false=[1, 3, 5], true=[2, 4, 6]}
```
该代码将根据数字的奇偶性将它们分为两组,并返回一个Map对象,其中Key为true/false,Value为对应的分组结果。
阅读全文