Java 8中的递归lambda表达式

我只想递归地定义一个Java 8 lambda表达式。

Lambda FAQ提到只能在(静态)字段初始化期间定义递归lambda表达式。

但是我在IntelliJ中遇到编译器错误(javac只报告没有消息的错误):

java:初始化程序中的自引用

如果我尝试写类似的东西:

static UnaryOperator f = i -> i == 0 ? 1 : i * f.apply( i - 1); 

要么

 UnaryOperator f = i -> i == 0 ? 1 : i * f.apply( i - 1); 

我发现使其工作的一种方法是使用数组来引用lambda有效地欺骗java编译器:

 import java.util.function.UnaryOperator; public class RecursiveLambdaExample { public static void main(String[] args) { UnaryOperator[] fac = new UnaryOperator[1]; fac[0] = i -> i == 0 ? 1 : i * fac[0].apply( i - 1); UnaryOperator factorial = fac[0]; System.out.println(factorial.apply(5)); } } 

是否有另一种技巧来定义递归的lambda表达式?

您可以通过完全限定递归引用的字段名称来使其工作。 此版本编译时没有任何错误:

 import java.util.function.UnaryOperator; public class RecursiveLambdaExample { static UnaryOperator fac = i -> i == 0 ? 1 : i * RecursiveLambdaExample.fac.apply( i - 1); UnaryOperator f = i -> i == 0 ? 1 : i * this.f.apply( i - 1); public static void main(String[] args) { System.out.println(new RecursiveLambdaExample().f.apply(5)); System.out.println(fac.apply(5)); } } 

相关: 为什么Java 8中的lambdas不允许对匿名类没有的成员变量进行前向引用?