2016-12-01 46 views
2

我正在使用java流的缩减功能。 我流数据如下:使用缩小功能时返回第一个元素

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)); 

我Reduce函数如下:

persons.stream() 
      .reduce((p1, p2) -> p1.age > p2.age ? p1 : p2) 
      .ifPresent(System.out::println); 

这是我得到的是

帕姆

但我的结果要求是要求彼得,因为它也具有大于o的值thers。

彼得

我怎样才能做到这一点?任何其他替代方法来做到这一点

+0

它不是p1:p2(或反之亦然)而不是p2:p2? –

+0

是它的p1:p2。编辑了这个问题。 – KayV

+3

'.reduce((p1,p2) - > p1.age> = p2.age?p1:p2)'。顺便说一句,就是'.max(Comparator.comparing(p-> p.age))',或者如果你关心性能,'.max(Comparator.comparingInt(p-> p.age) )'。 – Holger

回答

3

尝试:

persons.stream() 
     .reduce((p1, p2) -> p1.age >= p2.age ? p1 : p2) 
     .ifPresent(System.out::println); 

注意,我改变了条件从p1.age > p2.agep1.age >= p2.age,使得具有相同的年龄较早Person实例作为以后的实例将是首选。

+0

编辑该问题 – KayV

2

简单的规则如下减少:

对于给定的对人,p1p2

  1. 如果p1.age < p2.age,结果应该是p2
  2. 如果p1.age > p2.age,结果应该是p1
  3. 如果p1.age == p2.age,结果应该是p1

易于实施:

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

PS:你目前的代码有一个类型0,将永远减少对最后一个元素列表,忽略了年龄比较。

相关问题