使用收集器从列表中获取平均数据。Averaging java

使用收集器从列表中获取平均数据。Averaging java,java,lambda,collectors,Java,Lambda,Collectors,我有两种不同方法的代码,但其中一种方法有效,另一种方法未编译,我不知道哪里出了问题。 代码如下: public class CollectorOperations { public int averageAgeInt(List<Person> persons) { return persons.stream() .collect(Collectors.averagingInt(person -> person.g

我有两种不同方法的代码,但其中一种方法有效,另一种方法未编译,我不知道哪里出了问题。 代码如下:

    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平均int(列出人员){
returnpersons.stream()
.collect(Collectors.averagint(person->person.getAge());
}
public double average double(列出个人列表,int i){
return personList.stream()
.collect(Collectors.averagint(person->person.getAge());
}
}
班主任{
私有字符串名称;
私有字符串lastName;
私人互联网;
公众人物(字符串名称、字符串姓氏){
this.name=名称;
this.lastName=lastName;
}
公众人物(字符串名称、字符串姓氏、整数年龄){
this.name=名称;
this.lastName=lastName;
这个。年龄=年龄;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
@凌驾
公共字符串toString(){
返回“Person{”+
“name=”+name+“\”+
“,lastName='”+lastName+'\''+
'}';
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
}
这两种方法之间的唯一区别是返回类型,当返回类型为
int
时,我无法从lambda表达式中获取
person.age()
,但当我将返回类型更改为
double
时,它就工作了

附言。
对不起,我的英语不好。

由于此处的类型不匹配,因此无法编译:

persons.stream().collect(Collectors.averagingInt(person -> person.getAge()));
该操作返回Double类型的对象,但您的方法被定义为返回整数

原因是不能将双精度对象强制转换为int,但由于它是双精度对象,因此可以通过调用方法
Double\intValue()

你需要像这样做

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

我不明白为什么在方法AverageDouble中有一个参数
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()));
}
public int averageint(列出人员){
返回(整数)平均双倍(人);
}
公共双平均双(列表个人列表){
return personList.stream().collect(Collectors.averagint(person->person.getAge());
}

收集器。Averagint
提供了
双精度
,这对于平均值来说完全是合理的,那么为什么您会期望int?谢谢您的回答,当我在java文档中查看时,我了解Averagint方法返回收集器,它不使用整数值。