我有以下情况。
我想在lambda表达式中使用变量。但是这个变量将根据条件具有一次性值(最终)。
final String constraintsAmount;
if(constraint.isPresent()) {
constraintsAmount = constraint.getValue();
}
在此之后,我开始使用forEach + lambda表达式迭代列表。 现在我必须在此迭代中使用此constraintsAmount字段。
但它表示" constraintsAmount可能尚未初始化"。
我怎样才能解决这个问题。
注意: 1)我不想将此变量声明为实例变量,我当然不想在迭代中声明和初始化此变量。 2)因为它是最终的我不能初始化它然后在if检查中重用它。所以想要检查一下是什么工作。
答案 0 :(得分:1)
从编译器的角度来看,你需要一个else块:
final String constraintsAmount;
if(constraint.isPresent()) {
constraintsAmount = constraint.getValue();
} else {
constraintsAmount = ...
}
三元运算符更好:
final String constraintsAmount = constraint.isPresent() ? constraint.getValue() : ...
注意:在Java 8中,您不需要声明变量final
以在"关闭"中使用它。 (里面的lambda东西)。
或许您可能需要完全重新设计代码。很难说,因为我没有足够的信息。
答案 1 :(得分:0)
Assumimg constraint
是Optional<String>
您可以执行以下操作:
String constraintsAmount = constraint.orElse(<somedefault>);
否则,如果您只想在constraint
具有值时执行某些操作,请执行以下操作:
constraint.ifPresent(constraintsAmount -> { .... });
答案 2 :(得分:0)
在使用之前,必须显式初始化局部变量
您的问题并非特定于final
修饰符或使用lambda表达式。
如果此条件为true
:if(constraint.isPresent()) {
,
constraintsAmount
已初始化。但在相反的情况下,它没有初始化。
因此,如果您使用此变量,编译器就不会接受它。
此代码说明了问题:
final String constraintsAmount;
if(constraint.isPresent()) { // initialized
constraintsAmount = constraint.getValue();
}
// if the conditional statement is false, the constraintsAmount var is not initialized
// So the compiler generates the error
// constraintsAmount might not have been initialized
String lowerCaseString = constraintsAmount.toLowerCase();
constraintsAmount
声明中的值else
或者删除final
以为变量提供默认值。