微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java lambda表达式如何引用自身?

我发现 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的数组来存储引用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐