为什么递归调用此函数不会抛出 NullPointerException
Why calling this function recursively does not throw a NullPointerException
我的问题来自这个。
考虑这段代码:
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。
希望我的问题很清楚
您的代码等同于
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 表达式不会执行出现在其主体中的代码。这只是一个声明,类似于您声明匿名 class 实例的方式。
我的问题来自这个
考虑这段代码:
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。
希望我的问题很清楚
您的代码等同于
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 表达式不会执行出现在其主体中的代码。这只是一个声明,类似于您声明匿名 class 实例的方式。