从Lambda内部设置局部变量值

时间:2018-09-11 14:08:13

标签: java lambda scope

我有以下代码:

  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

我该如何解决?

3 个答案:

答案 0 :(得分:1)

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

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

尽管我认为这不是最佳实践。我宁愿返回一个新的更改的值,而不是更改它。

答案 1 :(得分:1)

您在这里有两种选择:

  • 创建一个具有此属性的类,因此来自该对象的对象将是最终的,而不是实例变量
  • 设置变量类的作用域(多线程时要小心)

这些解决方案有效,但也许不是最佳选择,因此,请参见Lambdas: local variables need final, instance variables don't

答案 2 :(得分:0)

创建包装器:

private static class Integerwrapper {
    private int num;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

并用作您的int。

编辑:

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