Java 1.8递归lambda

时间:2014-11-08 18:18:23

标签: 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;
        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));
    }
}

1 个答案:

答案 0 :(得分:1)

  1. 第一个错误:“初始化程序中的自引用”。这里的错误信息非常清楚。不允许在其初始化程序中引用变量。
  2. 这一行根本不是错误的原因。它绝对有效,实际上编译成功。出现此错误的原因是您重新分配factorial_lambda变量(在未注释掉的代码段中),因此它不再有效。它在lambda表达式体内使用。但是在lambda表达式主体中只允许最终或有效的最终局部变量。
  3. 您在此处使用原始类型。这就是为什么推导出的i类型是Object,而不是Integer。使用1运算符将其与==进行比较显然是编译错误。所以从中减去1。我建议尽可能避免使用原始类型。