gpt4 book ai didi

java - 在 Lambda 表达式上调用方法

转载 作者:行者123 更新时间:2023-11-29 06:48:12 24 4
gpt4 key购买 nike

有没有办法在 lambda 表达式上调用方法?

考虑以下示例,其中在 MileageComparator 上调用了 reversed() 方法:Collections.sort(cars, new MileageComparator().reversed());

但是,如果我将 MileageComparator 编写为带有 reversed() 调用的 Lambda 表达式,我在编写时会遇到错误Collections.sort(cars, ((Car car1, Car car2) -> (int) (car2.getMileage() - car1.getMileage())).reversed());虽然它在没有反转的情况下工作正常。

我知道我可以简单地交换 car1 和 car2 以获得相同的结果,但是我想知道一般情况下是否可以对 lambda 表达式进行方法调用。

最佳答案

I would however like to know if a method call on a lambda expression is possible in general.

不是,因为 lambda 表达式本身什么都不是。

lambda 表达式是实现功能接口(interface)的语法糖。没有定义方法签名的接口(interface),lambda 表达式不知道它是什么。

这就像使用未定义的类型名称创建匿名类,例如

new Foo() {
public void bar() {
// This will not work
}
}

如果 Foo 不存在,匿名类将无法编译。

类似地,(Car a) -> a.openDoor() 将无法编译,因为编译器不知道正在实现什么类型。为了使其工作,编译器需要知道要实现哪个功能接口(interface),例如

Consumer<Car> x = (Car a) -> a.openDoor();

但以下将失败并出现错误 Lambda 表达式需要一个明确的目标类型:

var x = (Car a) -> a.openDoor();

当您将 lambda 表达式括在括号中并在其上调用方法时,编译器无法推断出任何功能接口(interface),这就是失败的原因:

((Car a) -> a.openDoor()).accept(myCar)

但是,您可以通过提供强制转换告诉编译器要实现哪个接口(interface):

((Consumer<Car>) (Car a) -> a.openDoor()).accept(myCar)

关于java - 在 Lambda 表达式上调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59340802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com