相关疑难解决方法(0)

使用Java 8实现递归lambda函数

Java 8引入了lambda函数,我想实现像factorial这样的东西:

 IntToDoubleFunction fact = x -> x == 0 ? 1 : x * fact.applyAsDouble(x-1);
Run Code Online (Sandbox Code Playgroud)

编译返回

  error: variable fact might not have been initialized
Run Code Online (Sandbox Code Playgroud)

我怎样才能参考功能本身.类是匿名的但是实例存在:它被调用fact.

java recursion lambda java-8

54
推荐指数
6
解决办法
3万
查看次数

为什么Java 8中的lambdas不允许对匿名类没有的成员变量进行前向引用?

以下类包含一个成员变量runnable,该变量使用匿名内部类的实例进行初始化.内部类引用相同的成员:

class Example {
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            System.out.println(runnable);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

只要在分配成员之前未执行该方法并且JLS允许这样的引用,这就不是问题.

理论上,成员变量的声明可以转换为lambda表达式,如下所示:

Runnable runnable = () -> System.out.println(runnable);
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这在功能上等同于前面的示例,但它被javac 1.8.0_05以下错误消息拒绝:

Error:(2, 54) java: self-reference in initializer
Run Code Online (Sandbox Code Playgroud)

虽然这种说法是正确的,但我不明白为什么不允许这样做.这是故意不允许的,可能是因为lambda表达式被编译为不同的字节代码,如果它被允许会导致问题?或者刚被禁止,因为这些引用在匿名内部类中使用时已经存在问题?还是JLS作家无意中不允许这样做?或者它是一个错误javac

lambda javac java-8

21
推荐指数
1
解决办法
2600
查看次数

标签 统计

java-8 ×2

lambda ×2

java ×1

javac ×1

recursion ×1