Tho*_*ont 11 java lambda java-8
我只想递归地定义一个Java 8 lambda表达式.
的LAMBDA FAQ提到一个只能在(静态)字段初始化定义递归lambda表达式.
但我在IntelliJ中遇到编译器错误(javac只报告没有消息的错误):
java:初始化程序中的自引用
如果我尝试写类似的东西:
static UnaryOperator<Integer> f = i -> i == 0 ? 1 : i * f.apply( i - 1);
Run Code Online (Sandbox Code Playgroud)
要么
UnaryOperator<Integer> f = i -> i == 0 ? 1 : i * f.apply( i - 1);
Run Code Online (Sandbox Code Playgroud)
我发现使其工作的一种方法是使用数组来引用lambda有效地欺骗java编译器:
import java.util.function.UnaryOperator;
public class RecursiveLambdaExample {
public static void main(String[] args) {
UnaryOperator<Integer>[] fac = new UnaryOperator[1];
fac[0] = i -> i == 0 ? 1 : i * fac[0].apply( i - 1);
UnaryOperator<Integer> factorial = fac[0];
System.out.println(factorial.apply(5));
}
}
Run Code Online (Sandbox Code Playgroud)
还有另一种技巧来定义递归的lambda表达式吗?
Dao*_*Wen 12
您可以通过完全限定递归引用的字段名称来使其工作.此版本编译时没有任何错误:
import java.util.function.UnaryOperator;
public class RecursiveLambdaExample {
static UnaryOperator<Integer> fac = i -> i == 0 ? 1 : i * RecursiveLambdaExample.fac.apply( i - 1);
UnaryOperator<Integer> 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));
}
}
Run Code Online (Sandbox Code Playgroud)
相关:为什么Java 8中的lambdas不允许对匿名类没有的成员变量进行前向引用?
| 归档时间: |
|
| 查看次数: |
4877 次 |
| 最近记录: |