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吗?
要根据年龄选择人员,您需要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)
按年龄对流的元素进行排序,然后选择第一个:
persons.stream()
.sorted(Comparator.comparing(Person::getAge).reversed())
.collect(Collectors.toMap(Person::getNationality, Person::getName, (n1, n2) -> n1));
Run Code Online (Sandbox Code Playgroud)