我正在使用java stream的reduce功能。 我的Stream数据如下:
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);
我得到的结果是
帕姆
但我的要求是元素彼得,因为它的价值也高于其他人。
彼得
我怎样才能做到这一点?还有其他替代方法吗?
答案 0 :(得分:3)
尝试:
persons.stream()
.reduce((p1, p2) -> p1.age >= p2.age ? p1 : p2)
.ifPresent(System.out::println);
请注意,我已将条件从p1.age > p2.age
更改为p1.age >= p2.age
,因此将优先使用与后续实例具有相同年龄的早期Person
实例。
答案 1 :(得分:2)
简单地按照以下规则减少:
对于一对特定的人,p1
和p2
:
p1.age < p2.age
,结果应为p2
p1.age > p2.age
,结果应为p1
p1.age == p2.age
,结果应为p1
。易于实施:
persons.stream()
.reduce((p1, p2) -> p1.age < p2.age ? p2 : p1)
PS:您当前的代码有一个typeo,并且总是会缩减到列表中的最后一个元素,忽略年龄比较。