有没有办法改变Java Lambda捕获的值



像这样:

Integer value = 3;
Consumer<Integer> consumer = input -> {
value = value * 2;
};
consumer.accept(100);
System.out.println(value);

谢谢! [已解决]

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 内部修改局部变量

不,这是不可能的。

JLS 15.27.2 说:

在 lambda 表达式中使用但未声明的任何局部变量、形式参数或异常参数都必须声明为 final,或者实际上是 final (§4.12.4(,否则在尝试使用时会发生编译时错误。

由于您在 lambda 中使用value,但在 lambda 外部声明它,因此它必须是 final或实际上是 final。这意味着您不能多次为其分配值。

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

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

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

下面是一个示例:

final int[] value = { 3 };
Consumer<Integer> consumer = input -> {
value[0] = value[0] * 2;
};
consumer.accept(100);
System.out.println(value[0]);

最新更新