gpt4 book ai didi

java - 如何在使用列表在 map 中分组时过滤年龄

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:42 25 4
gpt4 key购买 nike

类似于我之前的问题here ,我拥有的User对象是这些

new User("ayush","admin",23)
new User("ashish","guest",19)
new User("ashish","admin",20)
new User("garima","guest",29)
new User("garima","super",45)
new User("garima","guest",19)

现在,我正在尝试根据这些用户的不同年龄趋势来命名。但我需要在 threshold 年龄以上过滤它们。我可以使用

了解趋势
Map<String, List<Integer>> userNameAndAgeTrend = users.stream().collect(Collectors.groupingBy(user-> user.getName(), Collectors.mapping(u-> u.getAge(), toList())));

这给了我 {ashish=[19, 20], garima=[29, 45, 19], ayush=[23]}。但是在我使用这种分组的情况下,我无法使用阈值(例如 21 年)正确过滤列表。有人可以帮忙吗?

此外,使用 .filter(user -> user.getAge() > 21) 没有为 ashish 提供映射,这也是我想要存储的。我可以使用我机器上安装的 Java10 并尝试建议的解决方案。

最佳答案

Stream.filter

你可以使用filter作为

Map<String, List<Integer>> userNameAndAgeTrend = users.stream()
.filter(a -> a.getAge() > 21) // only above 21
.collect(Collectors.groupingBy(User::getName, Collectors.mapping(User::getAge, Collectors.toList())));

正如您在评论中确认的那样,这将为您提供输出

{garima=[29, 45], ayush=[23]}

Collectors.filtering

如果您要查找所有名称,您还可以使用 Collectors.filtering明确指出类似的行为(格式化我的):

Using a filtering collector as shown above would result in a mapping from that department to an empty Set.

If a stream filter() operation were done instead, there would be no mapping for that department at all.

它的用法应该是这样的:

Map<String, List<Integer>> userNameAndAgeTrend = users.stream()
.collect(Collectors.groupingBy(User::getName, Collectors.mapping(User::getAge,
Collectors.filtering(age -> age > 21, Collectors.toList()))));

现在的输出是

{ashish=[], garima=[29, 45], ayush=[23]}

关于java - 如何在使用列表在 map 中分组时过滤年龄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53859947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com