首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法改变Java捕获的值?

有没有办法改变Java捕获的值?
EN

Stack Overflow用户
提问于 2018-05-04 02:01:12
回答 2查看 594关注 0票数 1

就像这样:

代码语言:javascript
复制
    Integer value = 3;
    Consumer<Integer> consumer = input -> {
        value = value * 2;
    };
    consumer.accept(100);
    System.out.println(value);

谢谢!解出

代码语言:javascript
复制
    AtomicInteger value = new AtomicInteger(3);
    Consumer<Integer> consumer = input -> {
        value.getAndAdd(5); // 8
        System.out.println(value.get());
    };
    consumer.accept(100);
    System.out.println(value.get()); // 8

也感谢尤默?法鲁克的回答从lambda内部修改局部变量

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-04 02:16:16

不那是不可能的。

JLS 15.27.2说:

在lambda表达式中使用但未声明的任何局部变量、形式参数或异常参数必须声明为“最终”或“有效终结”(§4.12.4),或者在尝试使用时出现编译时错误。

因为在lambda中使用value,但在lambda之外声明它,所以它必须是最终的或实际上是最终的。这意味着您不能不止一次地给它赋值。

当然,如果value是一个可变对象(例如,一个AtomicInteger ),那么您就可以修改它。value引用本身将保持不变,但它引用的对象将被更改。

票数 3
EN

Stack Overflow用户

发布于 2018-05-04 02:52:34

因此,由于Java编译器只允许在lambda或匿名内部类中访问最终引用或成员引用,所以答案是否定的。但是,您可以(就像您似乎已经发现的那样)更改最终引用中的状态。

您找到了AtomicInteger的解决方案,它在您修改Integer时适用于您的特定情况。但是,将您的引用放在最后的单个值数组中将对所有内容都有效。它不是很漂亮,但是如果您正在使用IntelliJ,如果您尝试在这种情况下修改最终状态,它将为您提供此更改。

下面是一个示例:

代码语言:javascript
复制
final int[] value = { 3 };
Consumer<Integer> consumer = input -> {
    value[0] = value[0] * 2;
};
consumer.accept(100);
System.out.println(value[0]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50166103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档