1

したがって、私の関数型プログラマーは、関数を第一級市民として扱う Python のような言語が好きです。Java 8 はプレッシャーに屈し、ラムダ式やメソッド参照などを実装したようです。

私の質問は、Java がファースト クラス関数を使用する方向に進んでいるのか、それともランナブルなどの匿名クラス/インターフェイスを実装するために必要なコード量を減らすための構文糖衣にすぎないのかということです。(私の腸は後者を言います)。

私の理想のシナリオ

Map<String,DoubleToDoubleFunc> mymap = new HashMap<String,DoubleToDoubleFunc>();
...
mymap.put("Func 1", (double a, double b) -> a + b);
mymap.put("Func 2", Math::pow);
...
w = mymap.get("Func 1")(y,z);
x = mymap.get("Func 2")(y,z);
4

4 に答える 4

1
interface DoubleDoubleToDoubleFunc {
    double f(double x, double y);
}

public static void main(String[] args) {
    Map<String, DoubleDoubleToDoubleFunc> mymap = new HashMap<>();
    mymap.put("Func 1", (double a, double b) -> a + b);
    mymap.put("Func 2", Math::pow);
    double y = 2.0;
    double z = 3.0;
    double w = mymap.get("Func 1").f(y,z);
    double v = mymap.get("Func 2").f(y,z);
}

したがって、それはまだ構文糖衣であり、ある程度しかありません。

于 2014-03-26T15:20:40.683 に答える
1

匿名クラスのシンタックス シュガーではありません。コンパイルされるものは、もう少し複雑です。(そうすることが間違っているというわけではありません。どの言語にも、ラムダのコンパイル方法に関する独自の実装の詳細があり、Java は他の多くの言語よりも悪くはありません。)

詳細については、 http: //cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html を参照してください。

于 2014-03-26T15:13:57.460 に答える