java8使用groupby的多种用法
时间: 2023-09-25 09:06:10 浏览: 42
在 Java 8 中,GroupBy 是一个非常强大的功能,可以对集合中的元素进行分组,这样就可以更加方便地对数据进行处理。下面是几种使用 GroupBy 的方法:
1. 按照单个属性进行分组
可以使用 `Collectors.groupingBy()` 方法按照集合中对象的某个属性进行分组,例如:
```java
Map<String, List<Person>> personGroups = persons.stream()
.collect(Collectors.groupingBy(Person::getCountry));
```
这个例子中,我们将集合中的对象按照 `Person` 类中的 `country` 属性进行分组,得到一个 `Map` 类型的结果。
2. 按照多个属性进行分组
如果需要按照多个属性进行分组,可以使用 `Collectors.groupingBy()` 方法的重载版本,例如:
```java
Map<String, Map<String, List<Person>>> personGroups = persons.stream()
.collect(Collectors.groupingBy(Person::getCountry, Collectors.groupingBy(Person::getCity)));
```
这个例子中,我们将集合中的对象按照 `Person` 类中的 `country` 和 `city` 属性进行分组,得到一个嵌套的 `Map` 类型的结果。
3. 对分组结果进行统计
可以使用 `Collectors.groupingBy()` 方法的另一个重载版本,对分组结果进行统计,例如:
```java
Map<String, Long> personCountByCountry = persons.stream()
.collect(Collectors.groupingBy(Person::getCountry, Collectors.counting()));
```
这个例子中,我们将集合中的对象按照 `Person` 类中的 `country` 属性进行分组,并统计每个分组中的元素个数。
4. 对分组结果进行计算
可以使用 `Collectors.groupingBy()` 方法的另一个重载版本,对分组结果进行计算,例如:
```java
Map<String, Double> personAverageAgeByCountry = persons.stream()
.collect(Collectors.groupingBy(Person::getCountry, Collectors.averagingDouble(Person::getAge)));
```
这个例子中,我们将集合中的对象按照 `Person` 类中的 `country` 属性进行分组,并计算每个分组中的元素的平均年龄。
5. 分组并转换结果类型
有时候需要将分组结果转换成另一种类型,可以使用 `Collectors.groupingBy()` 方法的另一个重载版本,例如:
```java
Map<String, Set<String>> personNamesByCountry = persons.stream()
.collect(Collectors.groupingBy(Person::getCountry, Collectors.mapping(Person::getName, Collectors.toSet())));
```
这个例子中,我们将集合中的对象按照 `Person` 类中的 `country` 属性进行分组,并将每个分组中的元素的 `name` 属性转换成一个 `Set` 类型的结果。
这些是 Java 8 中使用 GroupBy 的几种方法,可以根据需求选择合适的方法进行使用。