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可以声明自己的局部变量并对其进行变异。