繁体   English   中英

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引用,但是随后出现错误消息: “ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM