2016-12-01 6 views
2

私はJavaストリームのreduce機能を使用しています。 次のように私のストリームデータがある次のようにreduce関数を使用して最初の要素を返します

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

私が得る結果は

パム

しかし、私です要件は、それがまたoより大きい値を持つようにピーターを要素にすることですthers。

ピーター

私はこれをどのように達成することができますか?これを行うための代替手段はどれですか?

+0

p2:p2ではなくp1:p2(またはviceversa)ですか? –

+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

試してみてください。後でインスタンスと同じ年齢を持つ以前Personインスタンスが優先されるように、私は、p1.age > p2.ageからp1.age >= p2.ageに条件を変更し

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

注意。人々の特定のペアのために

p1p2

+0

編集された質問 – KayV

2

単純に次のルールを減らすp1.age > p2.age場合p1.age < p2.age場合

  1. 、結果はp2
  2. する必要があり、結果はp1
  3. する必要があります
  4. p1.age == p2.ageの場合、結果はp1である必要があります。

簡単に実装:

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

PS:あなたの現在のコードはtypeoを持ち、常に年齢の比較を無視して、リストの最後の要素に削減されます。

関連する問題