像这样:
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]);