2016-12-01 4 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)); 

Моя Снижение функции выглядит следующим образом:

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

результат, который я получаю

Pam

Но мой требование принадлежит элементу Петра, так как оно также имеет значение больше, чем о . Про ч ее

Питер

Как я этого добиться? Кто-нибудь другой может это сделать?

+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

Try:

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

Обратите внимание, что я изменил условие от p1.age > p2.age к p1.age >= p2.age, так что ранее Person экземпляр, имеющий тот же возраст, как будет предпочтительным позже экземпляр.

+0

Отредактированный вопрос – KayV

2

Просто уменьшить со следующими правилами:

Для данной пары людей, p1 и p2:

  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: ваш текущий код имеет typeo и всегда будет сократить до последнего элемента в списке, не обращая внимания на сравнение возраста.

Смежные вопросы