2017-06-21 6 views
1

私は2つの異なるメソッドを持つコードを持っていますが、そのうちの1つは動作していて、他のものはコンパイルされていません。Collectors.averagingIntを使用してリストから平均データを取得する

public class CollectorOperations { 

    public int averageAgeInt(List<Person> persons) { 
     return persons.stream() 
       .collect(Collectors.averagingInt(person -> person.getAge())); 
    } 

    public double averageAgeDouble(List<Person> personList, int i) { 
     return personList.stream() 
       .collect(Collectors.averagingInt(person -> person.getAge())); 
    } 
} 



class Person { 
    private String name; 
    private String lastName; 
    private int age; 

    public Person(String name, String lastName) { 
     this.name = name; 
     this.lastName = lastName; 
    } 

    public Person(String name, String lastName, int age) { 
     this.name = name; 
     this.lastName = lastName; 
     this.age = age; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Override 
    public String toString() { 
     return "Person{" + 
       "name='" + name + '\'' + 
       ", lastName='" + lastName + '\'' + 
       '}'; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 
} 

戻り値の型が、私はラムダ式からperson.age()を取得することはできませんが、私はdoubleに戻り値の型を変更したときに、それが働いてintあるとき、この2つの方法の間の唯一の違いは、戻り値の型である:ここで コードです。

P.S.申し訳ありません、私の英語です。

+0

'Collectors.averagingInt'は平均的には完全に意味のある「Double」を提供しますが、なぜあなたはintを期待しますか? – Joel

答えて

3

ここに起因する型の不一致をコンパイルされていません。

persons.stream().collect(Collectors.averagingInt(person -> person.getAge())); 

操作はDouble型のオブジェクトを返しますが、あなたの方法は整数を返すように定義されていること。

理由はDoubleオブジェクトがintにキャストすることができないということですが、それはDoubleオブジェクトであるため、あなたはあなたが

ような何かをする必要がある方法 Double#intValue()

を呼び出して整数値を取得することができます

return persons.stream().collect(Collectors.averagingInt(person -> person.getAge())).intValue(); 

あなたはもっとエレガントな方法を定義することができるようにaverageAgeDoubleは(変数が使用されることはありません)、あなたが取り除く場合方法でパラメータint iを持っている理由私は得ることはありませんその変数:

public int averageAgeInt(List<Person> persons) { 
    return (int) averageAgeDouble(persons); 
} 

public double averageAgeDouble(List<Person> personList) { 
    return personList.stream().collect(Collectors.averagingInt(person -> person.getAge())); 
} 
+0

答えをくれてありがとう、java-docを見てみると、averagingIntメソッドがコレクタを返し、それが整数値では動作していないことを理解しました。 –

関連する問題