使用收集器从列表中获取平均数据。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方法返回收集器,它不使用整数值。