Java 1.8递归lambdas

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

我确实理解正向参考错误,但为什么我必须通过以下步骤来解决问题 定义n? 我已经注释掉了错误并添加了我看到的编译器错误

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再次说明,您在其初始值设定项中使用了对变量的引用。谢谢,我确实有了更好的理解。