我有以下代码片段:
SomeClass someClass;
switch (type) {
case FIRST:
someClass = new SomeClass();
break;
case SECOND:
OptionalLong optional = findSomeOptional();
optional.ifPresent(value -> someClass = new SomeClass(value));
}
我正在尝试将新对象分配给lambda expresion中的 someClass 引用,但后来我收到了错误消息:“lambda中使用的变量应该是有效的最终”
当我将最终添加到someClass的声明时,我得到了另一个错误“无法为最终变量赋值”
那么我怎么能在lamdas中巧妙地处理这样的分配呢?
答案 0 :(得分:2)
简单的答案是你不能在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
。
答案 1 :(得分:1)
您是否必须使用OptionalLong
,还是可以使用Optional<Long>
?
您想要做的事情的恰当成语是someClass = optional.map(SomeClass::new).orElse(someClass)
。但是,由于某种原因,OptionalLong
没有map(LongFunction)
方法。
答案 2 :(得分:-1)
AtomicReference可以声明为final,用于保存引用。