带有局部变量捕获的 Java lambda 表达式

标签 java lambda

由于并发问题,局部变量成为最终变量或有效最终变量的原因。在 jls 8 规范中,有以下规定。

The restriction to effectively final variables prohibits access to dynamically-changing local variables, whose capture would likely introduce concurrency problems.

一切都很好,但我做了一个小实验。如果我同步该方法,这将消除动态更改局部变量的可能性,因为我保证只有一个线程可以执行此代码。但编译抛出了一个错误,指出它必须是最终的或有效的最终的。

逻辑正确吗?

考虑以下代码:

    public synchronized void capture() {

        int localVariable = 100;

        Interf i = (text) -> System.out.println(text + localVariable);

        i.m1("This local variable is: ");

        localVariable = 1000;
    }
}

最佳答案

答案很简单,您的变量在方法结束时超出了范围。使用有效的最终变量可以轻松解决这个问题,因为编译器只是将值复制到 lambda 中。由于 lambda 表达式中的代码也可以在方法外部运行(其中可修改变量已被垃圾回收),因此这是行不通的。您也不能指望编译器以某种方式复制您的变量,然后在 lambda 表达式之外修改它时动态更改它。我希望这能解决问题。

关于带有局部变量捕获的 Java lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58208717/

相关文章:

java - 如何从 Java Web 应用程序控制 NGINX?

java - 从 Android 应用程序获取功耗

java - 如何推断类型,其中返回类型也是方法参数的上限和下限

java - 是否可以在 lambda 表达式中迭代数组? (java)

java - 内部类的构造函数引用在运行时因 VerifyError 而失败

c# - 使用 Lambda 的内部连接 ​​(LINQ)

java - Tomcat java.lang.NoClassDefFoundError : Could not initialize class

java - firstLast Java链表/节点

lambda - 如何在 Java 功能接口(interface)中使用 andThen 或类似方法包装函数

c# - 使用动态表达式对组进行 IQueryable LINQ 转换错误