使用reduce函数返回第一个元素

时间:2016-12-01 11:35:09

标签: java java-8 stream java-stream collectors

我正在使用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);

我得到的结果是

  

帕姆

但我的要求是元素彼得,因为它的价值也高于其他人。

  

彼得

我怎样才能做到这一点?还有其他替代方法吗?

2 个答案:

答案 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)

简单地按照以下规则减少:

对于一对特定的人,p1p2

  1. 如果p1.age < p2.age,结果应为p2
  2. 如果p1.age > p2.age,结果应为p1
  3. 如果p1.age == p2.age,结果应为p1
  4. 易于实施:

    persons.stream()
                .reduce((p1, p2) -> p1.age < p2.age ? p2 : p1)
    

    PS:您当前的代码有一个typeo,并且总是会缩减到列表中的最后一个元素,忽略年龄比较。