java - 在对象流中 - 如何过滤掉最高优先级的独特元素?
问题描述
我有一个问题,感觉使用 java 流应该很容易解决,但到目前为止我没有成功(至少以任何简单的方式)。
我有一个对象流
class Person {
String name;
int age;
}
List<Person> personList = Arrays.asList(
new Person("Eric", 10),
new Person("Eric", 20),
new Person("Anna", 20),
new Person("John", 20),
new Person("Mary", 5),
new Person("Mary", 20),
new Person("Mary", 10));
我将如何使用流来处理这个列表,这样我最终会得到一个列表(或任何其他集合),其中包含每个人(Eric、Anna、John 和 Mary)以及他们的最高年龄。
[Person{name='Eric', age=20}, Person{name='Anna', age=20}, Person{name='John', age=20}, Person{name='Mary', age=20}]
显而易见的是正确实现 Equals/Hash,但我只提出每个人的第一次出现。我还查看了树集和比较器,但没有成功。
解决这个问题的最优雅的方法是什么?
提前致谢。
解决方案
如果您不想添加hashCode()
和类equals()
,Person
则可能必须按String
名称进行映射。您可以使用Collectors.groupingBy
,Collectors.mapping
并Collectors.maxBy
找到最大年龄:
Map<String, Optional<Integer>> collect = personList.stream()
.collect(groupingBy(Person::getName,
mapping(Person::getAge, maxBy(Integer::compare))));
或者正如霍尔格所指出的:
Map<String, Integer> collect = personList.stream()
.collect(toMap(Person::getName, Person::getAge, Math::max));
这将创建:
{Eric=Optional[20], John=Optional[20], Mary=Optional[20], Anna=Optional[20]}
推荐阅读
- javascript - 如何检查字体真棒是否被客户端浏览器阻止?
- amazon-web-services - TOKEN 端点返回没有客户端密码的 invalid_client
- angular - 将 mdbootstrap 集成到 Angular 项目中时出错
- python - 如何在 Python 中绘制 3D 图像?
- selenium - GeckoDriver 未在 Firefox 浏览器中输入 Firstname 字段的值
- raspberry-pi3 - 使用 iw 创建虚拟接口失败
- javascript - 如何在不使用内联 css 的情况下使用彩色文本框(红色/绿色)进行 Javascript 表单验证?
- webpack - 不允许加载本地资源 electron-webpack electron-builder
- python - 适用于 Python 的 Google Ads API:“_Rendezvous”对象没有属性“request_id”
- tags - 当我从应用程序登录然后从应用程序移动到网络时,访问者 ID 中间值在各个域之间不一致