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) 方法。