Collectors.groupingBy
时间: 2023-06-28 09:16:08 浏览: 49
Collectors.groupingBy 是一个 Java 8 中的 Collector,它可以将一个 Stream 中的元素按照指定的分类函数分类,并将分类结果放入一个 Map 中。具体来说,它的语法为:
```
groupingBy(Function<? super T, ? extends K> classifier)
```
其中,`T` 是 Stream 中元素的类型,`K` 是分类结果的类型,`classifier` 是用于分类的函数。例如,可以将一个字符串数组按照字符串长度分类:
```
String[] words = {"apple", "banana", "orange", "pear"};
Map<Integer, List<String>> groups = Arrays.stream(words)
.collect(Collectors.groupingBy(String::length));
```
这将得到一个 Map,其中键为字符串长度,值为该长度下的所有字符串。在本例中,结果为 `{5=[apple], 6=[banana, orange], 4=[pear]}`。
相关问题
collectors.groupingBy
groupingBy 是 Java 8 中 `Collectors` 类的一个静态方法,用于根据指定的分类条件对元素进行分组。它接受一个 `Function` 参数,该参数将元素映射为分组的依据,然后返回一个 `Collector` 对象,该对象用于对元素进行分组操作。
例如,如果我们有一个包含学生对象的列表,并且想根据学生的年级进行分组,我们可以使用 `groupingBy` 方法来实现:
```java
List<Student> students = ... // 学生列表
Map<Grade, List<Student>> studentsByGrade = students.stream()
.collect(Collectors.groupingBy(Student::getGrade));
```
在上面的示例中,`Student` 类具有一个 `getGrade` 方法,该方法返回学生的年级。`groupingBy` 方法通过传递 `Student::getGrade` 方法引用作为参数来将学生对象按照年级进行分组。最终的结果是一个 `Map` 对象,其中键是年级,值是相应年级的学生列表。
除了单个分类条件外,`groupingBy` 方法还支持多级分组、指定分组后的结果类型以及对每个组进行进一步操作等功能。更多关于 `groupingBy` 方法的详细信息可以参考 Java 官方文档。
collectors.groupingby
collectors.groupingBy是Java 8引入的一个用于分组的静态方法。这个方法接收一个Function作为参数,该Function会将每个元素映射到其所属的分组。然后将所有映射到同一个分组的元素收集到一个列表中,并将这些列表作为结果Map的值,该Map的键是每个分组的键。
举个例子,我们有一个User类,其中包含name和age两个属性,我们想将所有年龄相同的用户分成一组。可以使用如下代码:
```
List<User> users = getUsers();
Map<Integer, List<User>> groupByAge = users.stream().collect(Collectors.groupingBy(User::getAge));
```
这里我们调用了stream()方法将集合转换成流,然后调用collect()方法,使用groupingBy()方法对流中的元素进行分组,按照User的age属性为分组的键,将分组后的元素分别收集到列表中,并将这些列表作为Map的值。
除了上述用法,collectors.groupingBy方法还支持多级分组,以及可选的downstream collector等特性,可以更加灵活地应用于各种场景。
阅读全文