lambda 表达式中的变量赋值
Variable assignment in lambda expression
我有以下代码片段:
SomeClass someClass;
switch (type) {
case FIRST:
someClass = new SomeClass();
break;
case SECOND:
OptionalLong optional = findSomeOptional();
optional.ifPresent(value -> someClass = new SomeClass(value));
}
我正在尝试将新对象分配给 lambda 表达式中的 someClass 引用,但随后我收到错误消息:"variable used in lambda should be effectively final".
当我将 final 添加到 someClass 的声明中时,我遇到了另一个错误 "cannot assign value to final variable"
那么如何巧妙地处理lamdas中的此类赋值呢?
AtomicReference 可以声明为 final 并用于保存引用。
简单的答案是您不能在 lambda 表达式中从上层分配局部变量。
要么,你把你的变量变成一个实例成员,或者使用一个简单的 if 语句:
SomeClass someClass;
switch (type) {
case FIRST:
someClass = new SomeClass();
break;
case SECOND:
OptionalLong optional = findSomeOptional();
if(optional.isPresent()) {
someClass = new SomeClass(optional.getAsLong());
}
}
最后一个选项是使用 AtomicReference
。
你必须使用 OptionalLong
,还是可以使用 Optional<Long>
?
一个适合你想做的事情的成语是someClass = optional.map(SomeClass::new).orElse(someClass)
。但是,由于某些原因,OptionalLong
没有 map(LongFunction)
方法。
我有以下代码片段:
SomeClass someClass;
switch (type) {
case FIRST:
someClass = new SomeClass();
break;
case SECOND:
OptionalLong optional = findSomeOptional();
optional.ifPresent(value -> someClass = new SomeClass(value));
}
我正在尝试将新对象分配给 lambda 表达式中的 someClass 引用,但随后我收到错误消息:"variable used in lambda should be effectively final".
当我将 final 添加到 someClass 的声明中时,我遇到了另一个错误 "cannot assign value to final variable"
那么如何巧妙地处理lamdas中的此类赋值呢?
AtomicReference 可以声明为 final 并用于保存引用。
简单的答案是您不能在 lambda 表达式中从上层分配局部变量。
要么,你把你的变量变成一个实例成员,或者使用一个简单的 if 语句:
SomeClass someClass;
switch (type) {
case FIRST:
someClass = new SomeClass();
break;
case SECOND:
OptionalLong optional = findSomeOptional();
if(optional.isPresent()) {
someClass = new SomeClass(optional.getAsLong());
}
}
最后一个选项是使用 AtomicReference
。
你必须使用 OptionalLong
,还是可以使用 Optional<Long>
?
一个适合你想做的事情的成语是someClass = optional.map(SomeClass::new).orElse(someClass)
。但是,由于某些原因,OptionalLong
没有 map(LongFunction)
方法。