Java lambda表达式中的变量赋值

Java lambda表达式中的变量赋值,java,lambda,java-8,variable-assignment,final,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 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中使用的变量应该是有效的final”

当我将final添加到某个类的声明中时,我遇到了另一个错误“无法为final变量赋值”


那么,我如何才能巧妙地处理lamdas中的这种分配呢?

可以声明为final并用于保存引用。

可以声明为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());
    }
}

最后一个选项是使用原子引用。简单的答案是,不能从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());
    }
}

最后一个选项是使用
原子参考

您必须使用
可选长
,还是可以使用
可选


一个合适的习惯用法是
someClass=optional.map(someClass::new).orElse(someClass)
。但是,由于某些原因,
OptionalLong
没有
map(LongFunction)
方法。

您必须使用
OptionalLong
,还是可以使用
Optional


一个合适的习惯用法是
someClass=optional.map(someClass::new).orElse(someClass)
。但是,由于某些原因,
OptionalLong
没有
map(LongFunction)
方法。

为什么要使用lambda?为什么不干脆
someClass=optional.isPresent()?新建SomeClass(值):null?没有什么特别的。在我看来,当我对可选值进行操作时,使用ifPresent和lambda似乎是一种优雅的方式。不完全是,当您想要修改局部变量时。这不是lambdas支持的东西。当某个功能不适合时,我会使用其他功能。谢谢,这对我来说是一个很好的教训-不要尝试在所有可能的地方使用Lamda。为什么要使用lambda?为什么不干脆
someClass=optional.isPresent()?新建SomeClass(值):null?没有什么特别的。在我看来,当我对可选值进行操作时,使用ifPresent和lambda似乎是一种优雅的方式。不完全是,当您想要修改局部变量时。这不是lambdas支持的东西。当某个功能不适合时,我会使用其他功能。谢谢,这对我来说是一个很好的教训-不要尝试在所有可能的地方使用lamdas。更正:您不能在lambda中指定上级别的局部变量。lambda可以声明自己的局部变量并对其进行变异。更正:您不能在lambda中分配给uplevel局部变量。lambda可以声明自己的局部变量并对其进行变异。