2

My question comes from this thread.

Consider this code:

public class Test {    
    static Function<Integer, Integer> fibLambda = null;
    public static void main (String[] args) { 
        fibLambda = n -> n <= 2 ? 1 : fibLambda.apply(n - 1) + fibLambda.apply(n - 2); 
        System.out.println(fibLambda.apply(6));
    }
}

The output above is 8.

What I don't get is that how fibLamdba is initialized? It seems that I totally miss how the method invocation is done because I though that this code would produce a NPE.

Hope my question is clear

4

1 に答える 1

6

あなたのコードはと同等です

static Function<Integer, Integer> fibLambda = null;

public static void main(String[] args) {
    fibLambda = n -> n <= 2 ? 1 : Example.fibLambda.apply(n - 1) + Example.fibLambda.apply(n - 2);
    System.out.println(fibLambda.apply(6));
}

applyが呼び出されるまでにfibLambda、値が割り当てられます。基本的に、ラムダ式は の値をキャプチャしませんfibLambda。値を生成するために適切なタイミングで変数を評価する必要があることを登録するだけです。

ラムダ式は、その本体に表示されるコードを実行しないことに注意してください。これは単なる宣言であり、匿名クラス インスタンスを宣言する方法と似ています。

于 2015-01-04T20:09:36.390 に答える