java - java - 在java lambda表达式中使用groupingBy时如何获取id列表
问题描述
假设我们有一个对象User
:
public class User {
private Integer id;
private Integer age;
private String name;
private String family;
public User() {}
public User(Integer id, Integer age, String name, String family) {
this.id = id;
this.age = age;
this.name = name;
this.family = family;
}
// getters and setters emited for brevity
}
我编写如下的 lambda 表达式,以根据对某些字段进行分组来获取对象的平均年龄:
public static void main(String[] args) {
List<User> allUsers = new ArrayList<>();
allUsers.add(new User(1, 25, "Rasool", "Ghafari"));
allUsers.add(new User(2, 27, "Ali", "Sohrabi"));
allUsers.add(new User(3, 25, "Ali", "Azizkhani"));
allUsers.add(new User(4, 25, "Rasool", "Asadi"));
allUsers.add(new User(5, 27, "Ali", "Rasooli Sa'd Abad"));
allUsers.add(new User(6, 26, "Rasool", "Ameri"));
Map<List<Object>, Long> groupedResult =
allUsers.stream().collect(
groupingBy(
u -> Arrays.asList(u.getName()),
averagingDouble(User::getAge)
)
);
// result:
// {[Rasool] = 25.33, [Ali] = 26.33}
}
现在,我想在这个 lambda 中添加一些东西,但不知道该怎么做。我想获取id
每个组中分组对象的列表,可能是这样的:
// {[Rasool, [1, 4, 6]] = 25.33, [Ali, [2, 3, 5]] = 26.33}
解决方案
一点点改变就足够了:
Map<List<Object>, List<User>> groupedResult =
allUsers.stream().collect(
groupingBy(
u -> Arrays.asList(u.getName(), u.getAge()),
Collectors.toList()
)
);
推荐阅读
- sql - 添加新列,该列是另一个去除变音符号 (MSSQL) 的副本
- c# - 通过 int 属性比较两个自定义对象列表
- mysql - 我想知道 SQL 查询结果中重复值的计数
- java - 如何使用java在容器docker-compose内创建文件
- postgresql - 如何将 Keycloak 作为 Gitlab CI 服务运行
- c# - 通过剪贴板添加时无法从 Microsoft Teams Activity 访问图像
- certificate - 来自证书颁发机构的证书存储在 Google Cloud KMS 中的什么位置?
- c# - BindingContext 始终为空
- python - 使用 Python 脚本模拟标准输入
- python - 在 django 中,如何使用精确的外键获取所有数据?例如,获取外键 = 1 或 2 的所有帖子或