java - 有没有办法让 Java lambda 表达式不引用封闭对象?

标签 java lambda

当使用 lambda 表达式时,Java 实际上创建了一个匿名(非静态)类。非静态内部类始终包含对其封闭对象的引用。

当从另一个可能在不同进程中调用 lambda 的库调用此 lambda 表达式时,调用会因未找到类异常而崩溃,因为它无法在另一个进程中找到封闭对象的类。

考虑这个例子:

public class MyClass {
    public void doSomething() {
        remoteLambdaExecutor.executeLambda(value -> value.equals("test"));
    }
}

Java 会创建一个实现特定功能接口(interface)的匿名内部类,并将其作为参数传递给 executeLambda()。然后 remoteLambdaExecutor 将跨进程使用该匿名类以远程运行。 远程进程对 MyClass 一无所知,将抛出

java.lang.ClassNotFoundException: MyClass

因为它需要 MyClass 作为封闭对象引用。

我总是可以使用 API 期望的功能接口(interface)的静态实现,但这违背了目的并且不使用 lambda 功能。

有没有办法用lambda表达式来解决?

更新:我也不能使用静态类,除非它以某种方式导出到其他进程。

最佳答案

您的初始前提是错误的。 JRE 不会生成匿名内部类。它可能会生成一个类,但如果您的 lambda 表达式不访问 this 或该类的非 static 成员,它将保留对 this 实例的引用。

然而,这并不意味着类本身是不必要的。由于该类包含 lambda 表达式的代码,因此始终需要它。在这方面,您使用 static 嵌套类的解决方案不会改变它的任何内容,因为那时,执行代码。

如果不传输包含要执行的代码的类,就无法将对象传输到远程执行工具(除非该类已经存在于远程站点)。

关于java - 有没有办法让 Java lambda 表达式不引用封闭对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35636249/

相关文章:

java - 线程 "main"java.lang.NoClassDefFoundError : org/apache/http/ConnectionReuseStrategy: 中的异常

java - Robotium - 试图点击应用程序中的主页按钮

java - 多个 ServerSocket、多个设备并发送到多个套接字

java - java方法replaceAll()出错

c# - '=>' 是什么意思?

python - 搜索数据列中的字符串列表

java - 如何获取由 getString() 格式化的子字符串的位置?

c# - 删除集合中的重复值

python - 如何修改 lambda 函数中的变量?

java - 如何在 Beanshell 中使用或转义 java 8 Lambda 表达式