lambda表达式中的变量赋值

时间:2016-12-06 20:37:23

标签: java lambda java-8 variable-assignment final

我有以下代码片段:

    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中巧妙地处理这样的分配呢?

3 个答案:

答案 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,用于保存引用。