返回方法对流的引用



我有一个类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

我不确定你想要实现什么,但我确信,你的代码中有相当多的编译时错误:

  1. decideMapper方法中缺少一些右花括号;
  2. 对于默认情况,从decideMapper;
  3. 在IntStream上调用.avg(),这是不可用的。

相关内容

  • 没有找到相关文章

最新更新