就像这样:
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内部修改局部变量。
发布于 2018-05-04 02:16:16
不那是不可能的。
在lambda表达式中使用但未声明的任何局部变量、形式参数或异常参数必须声明为“最终”或“有效终结”(§4.12.4),或者在尝试使用时出现编译时错误。
因为在lambda中使用value,但在lambda之外声明它,所以它必须是最终的或实际上是最终的。这意味着您不能不止一次地给它赋值。
当然,如果value是一个可变对象(例如,一个AtomicInteger ),那么您就可以修改它。value引用本身将保持不变,但它引用的对象将被更改。
发布于 2018-05-04 02:52:34
因此,由于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]);https://stackoverflow.com/questions/50166103
复制相似问题