2016-11-04 11 views
1

性別と年齢フィールドを持つPersonクラスがあります。私は下のコードで各性別の年齢の合計を取得したいと思います。java8ストリームを使用して値の合計をグループ化した文と組み合わせる方法

public void test() { 
     List<Person> roster = new ArrayList(); 

     Map<Integer, Integer> totalAgeByGender = 
       roster 
         .stream() 
         .collect(
           Collectors.groupingBy(
             Person::getGender, 
             Collectors.reducing(
               0, 
               Person::getAge, 
               Double::sum))); 
    } 

    static class Person { 

     private int gender; 
     private double age; 

     public int getGender() { 
      return gender; 
     } 

     public double getAge() { 
      return age; 
     } 
    } 
} 

以下のように私は上記のコードでコンパイルエラーが生じています:それは、蒸気の文Double::sumの最後の部分を文句

Bad return type in method reference: cannot convert double to U. 

。年齢のタイプを整数に変更し、上記のコードでInteger::sumを使用すると、正常に動作します。この場合、Double :: sumで何が問題なのかわかりません。

また、セックス欄でグループ化してMap<Integer, List<Person>>を蒸気表記から返すことはできますか?

答えて

1

ここでは、次の2つのわずかな問題があります。(1)識別情報が整数として解釈されている。 (2)あなたの地図の値はダブルです。

Map<Integer, Double> totalAgeByGender = // not Map<Integer, Integer> 
    roster.stream() 
     .collect(Collectors.groupingBy(
      Person::getGender, 
      Collectors.reducing(
       0d, // not 0 
       Person::getAge, 
       Double::sum))); 

後述するように、あなたはこれをより簡潔で使用してエラーが発生しにくいCollectors.summingDoubleを作ることができる:

Map<Integer, Double> totalAgeByGender = roster.stream() 
    .collect(Collectors.groupingBy(
     Person::getGender, 
     Collectors.summingDouble(Person::getAge))); 

することはでき性別(男女)をグループ簡単に十分な:

Map<Integer, List<Person>> sexToPeople = roster.stream() 
    .collect(Collectors.groupingBy(
     Person::getGender, 
     Collectors.toList())); 
+2

'Collectors.summingDouble(Person :: getAge)'はより簡潔です。 –

+1

はい、申し訳ありません。更新しました。 – pscuderi

関連する問題