Collector.groupingBy()
时间: 2024-09-12 17:16:26 浏览: 50
`Collector.groupingBy()` 是Java 8中流(Stream)API的一部分,它用于通过给定的分类函数(Classifier Function)将流中的元素收集到一个Map中。`groupingBy`是`Collectors`类中的一个静态方法,它可以配合其他收集器使用来实现复杂的分组逻辑。
以下是`groupingBy`的一个基本用法,它接收一个分类函数作为参数,该函数定义了如何将流中的元素分配到不同的组中。在这个例子中,我们将一个用户列表按照用户的国家进行分组:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class User {
private String name;
private String country;
public User(String name, String country) {
this.name = name;
this.country = country;
}
public String getCountry() {
return country;
}
public String getName() {
return name;
}
}
public class GroupingByExample {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("Alice", "USA"),
new User("Bob", "USA"),
new User("Charlie", "UK"),
new User("David", "UK")
);
Map<String, List<User>> usersByCountry = users.stream()
.collect(Collectors.groupingBy(User::getCountry));
usersByCountry.forEach((country, usersList) -> {
System.out.println("Country: " + country);
usersList.forEach(user -> System.out.println("\tUser: " + user.getName()));
});
}
}
```
在这个例子中,`groupingBy(User::getCountry)` 创建了一个分类器,它根据用户的`country`属性将用户分组。流中的每个元素都会被传递到分类器,分类器返回一个键(在这个例子中是国家名),所有具有相同键的元素最终会被收集到同一个列表中。这个例子中的输出将是:
```
Country: USA
User: Alice
User: Bob
Country: UK
User: Charlie
User: David
```
`groupingBy`方法可以与下游收集器(downstream collector)一起使用来实现更复杂的分组逻辑。例如,如果你想按照国家分组的同时,还要对每个国家的用户列表进行排序,你可以这样做:
```java
Map<String, List<User>> sortedUsersByCountry = users.stream()
.collect(Collectors.groupingBy(
User::getCountry,
Collectors.toList(),
Collectors.collectingAndThen(
Collectors.toList(),
list -> {
list.sort(Comparator.comparing(User::getName)); // 按用户名排序
return list;
}
)
));
```
这个例子中的`groupingBy`方法接收三个参数:
1. 分类函数(`User::getCountry`):决定分组的依据。
2. 中间收集器(`Collectors.toList()`):收集每个分组中的元素到列表。
3. 下游收集器(`Collectors.collectingAndThen(...)`):在分组完成后应用的额外收集器,这里用于对每个国家的用户列表进行排序。
阅读全文