【问题标题】:Referencing a local variable while iterate a HashMap -> local variables referenced from a lambda expression must be final or effectively final error在迭代 HashMap 时引用局部变量 -> 从 lambda 表达式引用的局部变量必须是最终的或有效的最终错误
【发布时间】:2017-05-20 11:45:24
【问题描述】:

今天我想做一些我想完成的项目,但我遇到了一个我无法从 lambda 表达式引用局部变量的异常。 我有一个方法,我给出两个值,该方法检查值对是否已经在 HashMap 中

public void METHOD_NAME(Value value1, Value value2) {
    boolean founded = false;
  //values is the name of the HashMap
    this.values.forEach((value1Map, value2Map) -> {
            if(value1Map == value1&&value2Map == value2){
                this.doSomeStuff();
                founded = true;
            }

    });

}

当它完成时,我想读出需要知道他是否找到它的布尔值 成立=假; 我如何设置在这个 lambda 中创建或有任何其他方法可以做到这一点?

【问题讨论】:

  • find -> found ...“founded”有不同的含义。
  • This 应该会有所帮助。

标签: java variables lambda


【解决方案1】:

您可以在 lambda 中使用原语的原子变体。替换

boolean founded = true

通过这个

final AtomicBoolean found = new AtomicBoolean(false);

并像这样在你的 lambda 中设置它

found.set(true);

顺便说一句,绝对可以不要用 lambda 替换每次迭代。 for 循环仍然有效,并且在某些情况下比 lambda 更有优势。

我已将 founded 更改为 found,正如 Tom 在您问题的 cmets 中指出的那样。此外,您应该验证是否要与==而不是equals进行比较

【讨论】:

  • 首先感谢您的快速回答,现在可以使用了,谢谢;)我使用了 lambda,因为我认为使用它来遍历 HashMap 似乎更容易
  • 不客气。在您的情况下,我更喜欢 for 循环,因为使用 AtomicBoolean 的解决方法,并且因为您调用了流 API 的其他方法而不是 forEach。最终还是个人喜好。考虑将我的答案标记为已接受的解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-01-25
  • 2022-11-13
  • 2017-11-01
  • 2021-01-12
  • 1970-01-01
  • 2023-02-19
相关资源
最近更新 更多