这并不完全正确。默认方法可以在 lambda 表达式中使用。
interface Value {
int get();
default int getDouble() {
return get() * 2;
}
}
public static void main(String[] args) {
List<Value> list = Arrays.asList(
() -> 1,
() -> 2
);
int maxDoubled = list.stream()
.mapToInt(val -> val.getDouble())
.max()
.orElse(0);
System.out.println(maxDoubled);
}
按预期打印4
并在 lambda 表达式 ( .mapToInt(val -> val.getDouble())
)中使用默认方法
你文章的作者在这里试图做什么
Formula formula = (a) -> sqrt( a * 100);
是直接通过 lambda 表达式定义 a Formula
,它用作功能接口。
在上面的示例代码中,Value value = () -> 5
或者Formula
作为接口,例如
Formula formula = (a) -> 2 * a * a + 1;
但
Formula formula = (a) -> sqrt( a * 100);
失败,因为它试图访问 ( this.
)sqrt
方法,但它不能。Lambda 根据规范从其周围环境继承其范围,这意味着this
lambda 内部与直接在其外部引用相同的事物。sqrt
而且外面没有办法。
我对此的个人解释:在 lambda 表达式中,并不清楚 lambda 将被“转换”的具体功能接口。相比
interface NotRunnable {
void notRun();
}
private final Runnable r = () -> {
System.out.println("Hello");
};
private final NotRunnable r2 = r::run;
同一个 lambda 表达式可以“强制转换”为多种类型。我认为它好像 lambda 没有类型。这是一个特殊的无类型函数,可用于任何具有正确参数的接口。但是这个限制意味着你不能使用未来类型的方法,因为你不知道它。