|
我发现
this article在旧式函数与新的Java-8 lambda函数和并行处理的比较中非常有用.我无法理解的一件事是对lambda函数的一个限制:从第4页开始:
3.3 Preconditions Although lambda expressions are intended as a more con- cise alternative to AIC ,they are not a complete replacement. There are several preconditions that LambdaFicator checks before refactoring an AIC into a lambda expression. These preconditions are inherent to how lambda expressions are implemented in Java,not limitations of our tool. (P1) AIC must instantiate from an interface. Instances of abstract or concrete classes cannot be converted to lambda expressions. (P2) AIC must have no fields,and declare only one method. A lambda expression represents a single anonymous func- tion; therefore,an AIC with multiple methods can not be converted to a single lambda expression. (P3) AIC must not have references to this or super . In a lambda expression, this and super are lexically scoped, meaning they are interpreted just as they would be in the enclosing environment,e.g.,as if they appeared in the state- ment before the lambda expression [6]. However,in an AIC they refer to the inner class itself. (P4) AIC must not declare a recursive method. In order to perform the recursive call,we must obtain a reference to the anonymous function. While LambdaFicator could perform this refactoring,this could introduce unneeded complexity into the code and harm understandability.
在P4上,“AIC不能声明递归方法…… LambdaFicator可以执行这种重构……”,如何重构lambda表达式来引用自身?因为根据定义,这些lambda匿名函数没有可以引用的名称,并且没有对它们的引用(上面的P3).
解决方法
public class Test {
static Runnable r;
public static void main(String... args) {
r = () -> r.run();
r.run();
}
}
Runnable在运行时从字段r获得对自身的引用.
如果您不喜欢添加字段,也可以使用长度为1的数组来存储引用. (编辑:安卓应用网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|