使用 Collectors.averagingInt java 从列表中获取平均数据

Getting average data from list using 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;
    }
}

这两种方法唯一的区别是return类型,当return类型是int时,我无法从lambda表达式中得到person.age(),但是当我将 return 类型更改为 double 它正在工作。

P.S。 对不起我的英语。

这里由于类型不匹配而没有编译:

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

该操作 return 是一个 Double 类型的对象,但您的方法被定义为 return 一个整数。

原因是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()));
}