それは正確には真実ではありません。デフォルトのメソッドはラムダ式で使用できます。
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
され、ラムダ式内でデフォルトのメソッドを使用します ( .mapToInt(val -> val.getDouble())
)
あなたの記事の著者がここでやろうとしていること
Formula formula = (a) -> sqrt( a * 100);
Formula
ラムダ式を介して直接、関数インターフェイスとして機能する を定義することです。
上記のコード例、Value value = () -> 5
またはFormula
as interface などで問題なく動作します
Formula formula = (a) -> 2 * a * a + 1;
しかし
Formula formula = (a) -> sqrt( a * 100);
this.
( )sqrt
メソッドにアクセスしようとしているがアクセスできないため、失敗します。仕様によると、ラムダはその周囲からスコープを継承します。つまりthis
、ラムダの内側は、ラムダのすぐ外側と同じものを参照します。そして、sqrt
外に方法はありません。
これについての私の個人的な説明: ラムダ式の内部では、ラムダが「変換」される具体的な関数インターフェイスが明確ではありません。比較
interface NotRunnable {
void notRun();
}
private final Runnable r = () -> {
System.out.println("Hello");
};
private final NotRunnable r2 = r::run;
まったく同じラムダ式を複数の型に「キャスト」できます。ラムダに型がないかのように考えます。これは、適切なパラメーターを持つ任意のインターフェイスに使用できる特別な型のない関数です。しかし、その制限は、それを知ることができないため、future 型のメソッドを使用できないことを意味します。