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

时间:2017-06-21 09:59:04

标签: java lambda collectors

我有一个代码有两种不同的方法,但其中一种是工作而另一种没有被编译,我没有弄错。 这是代码:

    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。 对不起我的英文。

1 个答案:

答案 0 :(得分:3)

由于类型不匹配,它没有编译:

Double#intValue()

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

原因是Double对象不能转换为int,但由于这是一个Double对象,因此可以获取调用方法return persons.stream().collect(Collectors.averagingInt(person -> person.getAge())).intValue(); 的整数值

您需要执行类似

的操作
int i

我不明白为什么你在方法 averageAgeDouble (从不使用变量)中有参数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())); } ,所以你可以定义一个更优雅的方法,如果你摆脱变量:

{{1}}