考虑:
boolean somethingHappened = false;
Runnable doHappen = () -> { somethingHappened = true; }
你不能那样做,因为 somethingHappened
不是最终的。基本原理是,通常,您不需要更改从 lambda 范围捕获的变量。但是例如,当使用 Stream.forEach
时,这不是一个不寻常的需求。
我当然可以写一个包装器:
class Wrap<T>
{
public T value;
}
然后我将访问 somethingHappened.value
并更改它。
我只是想知道标准 Java 库中是否已经存在这种包装器。我只知道 Optional
是不可变的。我可以滥用数组 final boolean[] mutableBool = { false }
但那太可怕了。
最佳答案
Java 库中没有。但是 Apache Commons Lang 有 Mutable为了这。它为每个原始包装器提供子类,但每个包装器都是可变的(如 MutableInt、MutableBoolean 等)
您可以考虑使用它是否适合您。
更新
AtomicBoolean 是另一种选择。它允许您在线程之间共享它并更新它持有的 boolean 值。
我的 0.02 美元 - 每当我必须从 lambda 更新变量时,我都会退后一步,重新考虑我是否真的应该这样做,以及在这种情况下使用 lambda 是否是正确的选择。到目前为止 (AFAIR),我从来没有诉诸任何方法来克服 lambda 中使用的变量必须有效最终的限制。
关于java - 是否有原始值的对象包装器允许从 lambda 中改变它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73895366/