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

关于Java 1.8 递归 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26820462/

相关文章:

c++ - 带有模板参数的 Lambda 函数,而不是函数参数

java - If 和 else 同时声明虽然这不应该是可能的

Java EE - HTTP 错误 404 - 资源不可用 - 在页面上点击 "Submit"按钮后

caching - 返回 RDD 的 Apache Spark 方法(带尾递归)

java - 我如何在 Java 8 lambda 中制作这段代码

python - Lambda 函数无法正常工作

java - Java有没有存储键值对的数据结构,相当于C#中的IDictionary?

java - 在 Intellij IDEA 中用 build.gradle 替换 Build Artifact

java - 查找列表中小于给定值的最大整数和(代码跟踪)

xml - 使用 XSLT 递归删除空的 xml 元素