Collectors.toMap在不使用值的对象的属性上编写合并函数

Gov*_*are 6 java java-8 java-stream

我创建一个Map<String,String>List<Person>使用Java的8个流

persons.stream()
       .collect(Collectors.toMap(Person::getNationality, Person::getName, (name1, name2) -> name1)
Run Code Online (Sandbox Code Playgroud)

但是在以上情况下,我想通过使用人的年龄来解决名字冲突。有什么办法可以绕过传递合并功能(age1, age2) -> // if age1 is greater than age2 return name1, else return name2吗?

Hol*_*ger 8

要根据年龄选择人员,您需要Person实例来查询年龄。将映射Person到纯名称后,无法重新构成信息String

因此,您必须首先收集人员,以便能够选择最老的人员,然后将其映射到其姓名:

persons.stream()
    .collect(Collectors.groupingBy(Person::getNationality, Collectors.collectingAndThen(
        Collectors.maxBy(Comparator.comparingInt(Person::getAge)),
        o -> o.get().getName())));
Run Code Online (Sandbox Code Playgroud)

  • 从官方资源开始,[包文档](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#package.description),[类文档](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html),[lambda 教程](https://docs.oracle.com/javase/ tutorial/java/javaOO/lambdaexpressions.html)、[流教程](https://docs.oracle.com/javase/tutorial/collections/streams/index.html)、[相关增强功能](https://docs.当然,oracle.com/javase/8/docs/technotes/guides/language/lambda_api_jdk8.html)和 Stackoverflow。 (2认同)

Adr*_*ian 5

按年龄对流的元素进行排序,然后选择第一个:

persons.stream()
       .sorted(Comparator.comparing(Person::getAge).reversed())
       .collect(Collectors.toMap(Person::getNationality, Person::getName, (n1, n2) -> n1));
Run Code Online (Sandbox Code Playgroud)