首页 > 解决方案 > 在对象流中 - 如何过滤掉最高优先级的独特元素?

问题描述


我有一个问题,感觉使用 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,但我只提出每个人的第一次出现。我还查看了树集和比较器,但没有成功。

解决这个问题的最优雅的方法是什么?
提前致谢。

标签: javalambdacollectionsjava-stream

解决方案


如果您不想添加hashCode()和类equals()Person则可能必须按String名称进行映射。您可以使用Collectors.groupingBy,Collectors.mappingCollectors.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]}

推荐阅读