Java 使用reduce函数时返回第一个元素
我正在使用java stream的reduce功能。 我的流数据如下所示:Java 使用reduce函数时返回第一个元素,java,java-8,stream,java-stream,collectors,Java,Java 8,Stream,Java Stream,Collectors,我正在使用java stream的reduce功能。 我的流数据如下所示: List<Person> persons = Arrays.asList( new Person("Max", 18), new Person("Peter", 23), new Person("Pamela", 23), new Person("David", 12), n
List<Person> persons =
Arrays.asList(
new Person("Max", 18),
new Person("Peter", 23),
new Person("Pamela", 23),
new Person("David", 12),
new Person("Pam", 23));
persons.stream()
.reduce((p1, p2) -> p1.age > p2.age ? p1 : p2)
.ifPresent(System.out::println);
我得到的结果是
帕姆
但我的要求是元素彼得,因为它也有比其他人更大的价值
彼得
我怎样才能做到这一点?有其他替代方法吗?试试:
persons.stream()
.reduce((p1, p2) -> p1.age >= p2.age ? p1 : p2)
.ifPresent(System.out::println);
请注意,我将条件从
p1.age>p2.age
更改为p1.age>=p2.age
,以便优先选择与后一个实例年龄相同的较早的Person
实例。只需使用以下规则进行简化:
对于给定的两个人,p1
和p2
:
p1.age
,结果应该是p2
p1.age>p2.age
,结果应该是p1
p1.age==p2.age
,结果应该是p1
persons.stream()
.reduce((p1, p2) -> p1.age < p2.age ? p2 : p1)
persons.stream()
.减少((p1,p2)->p1.age
PS:您当前的代码有一个typeo,并且将始终减少到列表中的最后一个元素,忽略年龄比较。它不是p1:p2(或反之亦然)而不是p2:p2吗?是的,它是p1:p2。编辑问题。
.reduce((p1,p2)->p1.age>=p2.age?p1:p2)
。顺便说一下,这与.max(Comparator.comparating(p->p.age))
相同,或者,如果您关心性能,.max(Comparator.comparingit(p->p.age))
编辑了这个问题