2016-12-01 29 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,將永遠減少對最後一個元素列表,忽略了年齡比較。