2017-06-21 123 views
1

我有一个代码有两种不同的方法,但其中一个正在工作,另一个没有完成,我没有得到什么错误。 下面是代码:从列表中获取平均数据使用Collectors.averagingInt java

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

这两种方法之间的唯一区别是返回类型,当返回类型为int我不能从lambda表达式得到person.age(),但是当我改变返回类型为double它的工作。

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 f那个变量:

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返回收集器并且它不能使用整数值。 –