当前位置: 首页 > 知识库问答 >
问题:

有没有办法改变JavaLambda捕获的价值

华凯捷
2023-03-14

大概是这样的:

    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

也感谢Umer Farooq的回答:从lambda内部修改局部变量

共有2个答案

商正诚
2023-03-14

因此,由于Java编译器只允许在lambda或匿名内部类中访问最终引用或成员引用,因此答案是否定的。但是,您可以(正如您似乎已经发现的那样)更改最终引用内的状态。

您找到了使用几何学整数的解决方法,它适用于您修改整数的特定情况。不过,将您的引用放在最终的单个值数组中对所有事情都有效。它不是很漂亮,但是如果您使用的是IntelliJ,如果您在这种情况下尝试修改最终状态,它会为您提供此更改。

这里有一个例子:

final int[] value = { 3 };
Consumer<Integer> consumer = input -> {
    value[0] = value[0] * 2;
};
consumer.accept(100);
System.out.println(value[0]);

吴均
2023-03-14

不,那不可能。

JLS 15.27.2说:

在lambda表达式中使用但未声明的任何局部变量、形式参数或异常参数必须声明为final或有效final(§4.12.4),否则在尝试使用时会出现编译时错误。

由于在lambda中使用<code>value

当然,如果是可变对象(例如,AtomicInteger),那么您将能够对其进行更改。引用本身将保持不变,但它引用的对象将保持不变。

 类似资料:
  • 我有下一个树状图代码 而这个输出 如何更改每个子情节的大小?

  • 我再次编写另一个银行系统插件,但这次是使用ATM。我正在尝试弄清楚如何在单击该选项后获得玩家聊天输入,以防止单击100次以在银行帐户上存入50,000美元。 我正在用Paper-Spigot 1.14.4编写这个插件,我尝试了以下步骤: 作为一个单独的类,仅当我向插件管理器注册事件时才激活: 使用 get 和 set-method创建一个 变量 ,并在需要时在该方法中调用它。 我当前的方法: 获取

  • 问题内容: 当仅更改位置哈希值时,是否有办法应对javascript中的后退按钮被击中(或按下退格键)的问题?也就是说,当浏览器不与服务器通信或重新加载页面时。 问题答案: 使用事件: 如果需要支持较旧的浏览器,请查看Modernizr的HTML5跨浏览器Polyfills Wiki页面中的“事件”部分。

  • 问题内容: 在Unix上,是否有任何方法可以使一个进程更改另一个环境的变量(假设它们都由同一用户运行)?一般的解决方案是最好的,但如果不是,那么一个孩子是另一个孩子的特殊情况呢? 编辑:如何通过gdb? 问题答案: 通过gdb: 当然,这是一个很讨厌的黑客,应该只在调试场景中进行。

  • 我的数据结构是这样的,我想做的是从不同的节点获得价值。 现在,我想在添加人的孩子时获取位置的值(之前保存的LatLng)。但我知道的是要获得附加值。是否有方法引用不同的节点值? 另外,您能告诉我如何从数据库中获取LatLng并将其分配给LatLng吗?

  • 我有一个未来链,它获取一个资源,使用它来检索一些数据,然后修改该数据并返回结果(仍然在未来)。 我希望在返回未来链之前释放资源,但不必插入更接近的样板代码(即,将中间结果放入某个变量中,然后将其作为链其余部分的结果返回)。 我在找这样的东西: