[英]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引用,但是随后出现错误消息: “ lambda中使用的变量应该有效地是final” 。
当我将final添加到someClass的声明中时,出现另一个错误“无法将值分配给final变量”
那么,我该如何巧妙地应对lamda中的此类冲突?
一个简单的答案是,您不能在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)
方法。
AtomicReference可以声明为final并用于保存引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.