为什么递归调用此函数不会抛出NullPointerException

时间:2015-01-04 20:07:36

标签: java java-8 method-invocation

我的问题来自thread

考虑以下代码:

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));
    }
}

上面的输出是8.

我没有得到的是fibLamdba如何初始化?似乎我完全错过了方法调用是如何完成的,因为我虽然这个代码会产生一个NPE。

希望我的问题很清楚

1 个答案:

答案 0 :(得分: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时,会为其分配值。基本上,lambda表达式不会捕获fibLambda的值,它只是记录变量需要在适当的时刻进行求值以产生值。

请记住,lambda表达式不会执行其正文中出现的代码。它只是一个声明,类似于声明匿名类实例的方式。