Java 1.8递归lambdas
我确实理解正向参考错误,但为什么我必须通过以下步骤来解决问题 定义n? 我已经注释掉了错误并添加了我看到的编译器错误Java 1.8递归lambdas,java,recursion,lambda,Java,Recursion,Lambda,我确实理解正向参考错误,但为什么我必须通过以下步骤来解决问题 定义n? 我已经注释掉了错误并添加了我看到的编译器错误 import java.util.function.Function; class Recursion { Function<Integer, Integer> factorial_lambda = null; int factorial_imp(int i) { if (i == 1) return 1
import java.util.function.Function;
class Recursion {
Function<Integer, Integer> factorial_lambda = null;
int factorial_imp(int i) {
if (i == 1)
return 1;
else
return i * factorial_imp(i - 1);
}
/*
Function<Integer, Integer> factorial_lambda = (i) -> {
if (i == 1)
return 1;
else
return i * (factorial_lambda.apply(i - 1));
// error: self-reference in initializer
};
*/
public static void main(String[] args) { new Recursion(); }
public Recursion() {
/*
Function<Integer, Integer> factorial_lambda = (i) -> { return 1; };
// variable used in lambda expression should be final
// or effectively final;
// Function factorial_lambda = (i) -> { ...
//error: imcomparable types: Object and int if (i == 1)
//error: bad operand types for binary operator '-' apply(i - 1)
*/
factorial_lambda = (i) -> {
if (i == 1)
return 1;
else
return i * (factorial_lambda.apply(i - 1));
};
System.out.println(factorial_imp(5));
System.out.println(factorial_lambda.apply(5));
}
}
import java.util.function.function;
类递归{
函数阶乘λ=null;
整数阶乘(整数i){
如果(i==1)
返回1;
其他的
收益率i*阶乘μimp(i-1);
}
/*
函数阶乘λ=(i)->{
如果(i==1)
返回1;
其他的
返回i*(阶乘λ应用(i-1));
//错误:初始值设定项中的自引用
};
*/
公共静态void main(字符串[]args){new Recursion();}
公共递归(){
/*
函数阶乘λ=(i)->{return 1;};
//lambda表达式中使用的变量应为final
//或实际上是最终的;
//函数阶乘λ=(i)->{。。。
//错误:IMCompariable类型:Object和int if(i==1)
//错误:二元运算符“-”的操作数类型错误(i-1)
*/
阶乘λ=(i)->{
如果(i==1)
返回1;
其他的
返回i*(阶乘λ应用(i-1));
};
系统输出println(阶乘imp(5));
System.out.println(阶乘λ应用(5));
}
}
factorial_lambda
变量(在未注释掉的代码段中)因此它不再是有效的final。它在lambda表达式体中使用。但是在lambda表达式体中只允许使用final或有效的final局部变量i
的推断类型是对象,而不是整数的原因。使用=
运算符将其与1
进行比较显然是一个编译错误。从中减去1
也是一个编译错误。我建议尽可能避免使用原始类型
对我来说,它可以正常编译和工作。您使用的是什么编译器?很抱歉。问题是为什么各种注释代码片段不工作。例如,我无法在递归()中本地定义lambda factorial_lambda。谢谢,这非常有帮助。我唯一的问题是3。当Iput函数factorial_lambda2=(I)->{if(I==1)返回1;否则返回I*(factorial_lambda2.apply(I-1));};在递归体中,我得到一个错误:变量factorial_lambda2可能尚未初始化。我不确定是否有完整的响应。如果没有,当我放置函数factorial_lambda2=(I)->{if(I==1)返回1;否则返回i*(阶乘λ2.apply(i-1));};在递归体中,我得到一个错误:变量factorial_lambda2可能尚未初始化。@Jerrolds再次说明,您在其初始值设定项中使用了对变量的引用。谢谢,我确实有了更好的理解。