Java 8 中的方法参考

2022-09-04 00:44:27
public class Car {

    private int maxSpeed;

    public Car(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }

    public int getMaxSpeed() {
        return maxSpeed;
    }
}

我们可以按以下条件对汽车列表进行排序:

    Car carX = new Car(155);
    Car carY = new Car(140);

    List<Car> cars = new ArrayList<>();
    cars.add(carX);
    cars.add(carY);

    cars.sort(Comparator.comparing(Car::getMaxSpeed));

如果我们看到方法的签名,输入参数类型为Comparator.comparingFunction<? super T, ? extends U>

在上面的示例中,当以下内容未编译时,如何被强制转换为?Car::getMaxSpeedFunction<? super T, ? extends U>

  Function<Void, Integer> function = Car::getMaxSpeed;

答案 1

这是因为该方法是 .getMaxSpeedFunction<Car, Integer>

即:

<Car, Integer> Comparator<Car> java.util.Comparator.comparing(
    Function<? super Car, ? extends Integer> keyExtractor
)

注意

为了从带有 idiom 的实例引用,您必须声明一个带有签名的方法:。getMaxSpeedCar::CargetMaxSpeed(Car car)


答案 2

如果要为不带参数的方法(如已绑定到实例的方法)创建方法引用,则应使用 ,而不是 :SupplierFunction

Function<Car, Integer> f1 = Car::getMaxSpeed;

Car carx = new Car(42);
Supplier<Integer> f2 = carx::getMaxSpeed; 

在方法引用中,函数的“隐式”参数已经绑定到 ,因此您只剩下一个无参数函数(顺便说一句,它不能在 a 中使用),而在 Java 8 中,无参数函数只是一个 。carX::getMaxSpeedthiscarxComparatorSupplier

类似地,如果你有一个返回 的方法,你最终会得到一个:voidComsumer

Consumer<Integer> f3 = carx::setMaxSpeed;

推荐