【问题标题】:Set a local variable value from inside a lambda从 lambda 内部设置局部变量值
【发布时间】:2018-09-11 14:08:12
【问题描述】:

我有以下代码:

  public void visitStrAttribute(String attributeName, Consumer<String> attributeConsumer) {
    IntConsumer intConsumer;
    int stringByteArrayLength = 0;
    visitIntAttribute("", (IntValue) -> stringByteArrayLength = IntValue);
    attributeConsumer
        .accept(new String(readInputStream(stringByteArrayLength), StandardCharsets.UTF_8));
  }

我需要在 lambda 中设置 stringByteArrayLength,但出现一条错误消息,它告诉我 Local variable stringByteArrayLength defined in an enclosing scope must be final or effectively final

我该如何解决这个问题?

【问题讨论】:

标签: java lambda scope


【解决方案1】:

这里有两种选择:

  • 创建一个具有此属性的类,因此其中的对象将是最终的,但不是实例变量
  • 使变量类作用域(注意多线程)

这些解决方案有效,但也许不是最佳选择,所以要获得一些灵感,请参阅:Lambdas: local variables need final, instance variables don't

【讨论】:

    【解决方案2】:

    一种解决方案是使您的变量成为具有一个元素的最终数组,并修改其中的元素,如下所示:

    final int[] stringByteArrayLength = {0};
    visitIntAttribute("", (IntValue) -> stringByteArrayLength[0] = IntValue);
    

    虽然我不认为这是最佳做法。我宁愿返回一个新的更改值而不是更改它。

    【讨论】:

      【解决方案3】:

      创建包装器:

      private static class Integerwrapper {
          private int num;
      
          public int getNum() {
              return num;
          }
      
          public void setNum(int num) {
              this.num = num;
          }
      }
      

      并用作您的 int。

      编辑:

      您可以使用 int 包装器,例如:AtomicInteger

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-07
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多