我有一个类Care
class Car{
private int wheels;
private int doors;
...
public int getWheels(){ return wheels;}
public int getDoors(){ return doors:}
}
我有一组汽车
List<Car> cars = ...
我想计算集合中门窗的平均数量。我可以这样做:
cars.stream().mapToInt(Car::getWheels).avg().orElse(0.0)
cars.stream().mapToInt(Car::getDoors).avg().orElse(0.0)
但是,我想为此创建一个动态函数,例如:
public double calculateAvgOfProperty(List<Car> cars, String property){
Function<Car,Integer> mapper = decideMapper(property);
return cars.stream().maptoInt(mapper).avg().orElse(0.0);
}
public Function<Car,Integer> decideMapper(String ppr){
if( ppr.equals("doors") return Car::getDoors;
if( ppr.equals("wheels") return Car::getWheels;
}
然而,.mapToInt()
需要ToIntFunction<? super T> mapper
作为参数,但方法参考是Function<Car,Integer>
,因此不能进行强制转换。
但是,当我直接传递方法引用时,例如.mapToInt(Car::getDoors)
,它可以工作。
如何正确castFunction<Car,Integer>
所需的类型,然后?
您不应该将Function
转换为ToIntFunction
,因为它们没有关联(ToIntFunction
不扩展Function
)。然而,它们都是功能接口,因此方法引用也可以直接推断为ToIntFunction
。
在IntStream
中定义了一个average()
方法:
public double calculateAvgOfProperty(List<Car> cars, String property) {
ToIntFunction<Car> mapper = decideMapper(property);
return cars.stream().mapToInt(mapper).average().orElse(0.0);
}
public ToIntFunction<Car> decideMapper(String ppr){
if( ppr.equals("doors")) return Car::getDoors;
if( ppr.equals("wheels")) return Car::getWheels;
...
}
你的意思是创建一个这样的方法吗?
private double calculateAvgOfProperty(List<Car> cars, Function<Car, Integer> function) {
return cars.stream().mapToDouble(function::apply)
.average()
.orElse(0.0);
}
,然后你只能调用:
double r1 = calculateAvgOfProperty(cars, Car::getWheels);
double r2 = calculateAvgOfProperty(cars, Car::getDoors);
我不太明白你的问题,但是如果你愿意,你可以用mapToInt
代替mapToDouble
。
我不确定你想要实现什么,但我确信,你的代码中有相当多的编译时错误:
- 在
decideMapper
方法中缺少一些右花括号; - 对于默认情况,从
decideMapper
; - 在IntStream上调用
.avg()
,这是不可用的。