请考虑:

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 共享空间公司在这方面有Mutable个.它 for each 原语包装器提供子类,但每个子类都是可变的(如MuableInt、MuableBoolean等)

你可以考虑使用它对你来说是否可行.


UPDATE

原子布尔值是另一个 Select .它允许您在线程之间共享它,并更新它持有的布尔值.


我的0.02美元-每当我必须从lambda更新变量时,我都会后退一步,重新考虑是否真的应该这样做,以及使用lambda是否适合这种情况.到目前为止,我从未求助于任何方法来克服lambda中使用的变量必须有效地为最终变量的限制.

Java相关问答推荐

Java Stream,需要更新列表对象列表

Java List with all combinations of 8 booleans

使用标记时,场景大纲不在多个线程上运行

Java中是否有某种类型的池可以避免重复最近的算术运算?

如何判断一个矩阵是否为有框矩阵?

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

如何确定springboot在将json字段转换为Dto时如何处理它?

Chunk(Int)已弃用并标记为要删除

与不同顺序的组进行匹配,不重复组但分开

在向WebSphere中的文档添加元素时iText挂起

如果按钮符合某些期望,如何修改它的文本?

删除打印语句会影响功能...腐败在起作用?

JFree Chart从图表中删除边框

Java集合:NPE,即使没有添加空值

为什么项目名称出现在我的GET请求中?

ResponseEntity.控制器截断响应的JSON部分

始终使用Spring Boot连接mongodb上的测试数据库

Jackson YAML:支持锚点扩展/覆盖

如何在 lambda 中烘焙值

以较小的时间复杂度找到最大值的最小值