java - 是否有原始值的对象包装器允许从 lambda 中改变它们?

标签 java lambda primitive-types

考虑:

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/

相关文章:

java - Java 中将基元或对象放入对象映射中的区别

java - 对原始类型使用常量或枚举

deployment - Ubuntu下使用Deployment Toolkit检测openjdk?

将 Eigen::VectorXd 转换为 Eigen::MatrixXd 的 C++ lambda 函数

c++ - 不可恢复的 block 作用域错误,C++ 仿函数数组

c++ - 存储非负浮点值

java - jMock "unexpected invocation"对于我有一个 oneOf(instance).method() 预期的方法

java - 安卓 Eclipse : for each line of EditText

java - 使用大数据调用 post Rest api 时抛出错误

java - 使用 Eclipse 编译器编译时 LocalVariableTypeTable 中出现奇怪的 "!*"条目