我有以下代码:
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
。
我该如何解决?
答案 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