根据条件声明最终变量并在java中使用lambda表达式
我有以下情形。根据条件声明最终变量并在java中使用lambda表达式
我想在lambda表达式中使用一个变量。但是这个变量将有一个基于条件的一次性值(最终)。
final String constraintsAmount;
if(constraint.isPresent()) {
constraintsAmount = constraint.getValue();
}
在此之后,我开始迭代使用forEach + lambda表达式的列表。 现在我必须在这个迭代中使用这个constraintsAmount字段。
但它表示“constraintsAmount可能未被初始化”。
我该如何解决这个问题。
注意: 1)我不想声明这个变量作为一个实例变量,我当然不想在迭代中声明和初始化这个变量。 2)由于它是最后我不能初始化它,然后在if检查中重新使用它。所以想要检查什么是工作。
从你需要一个else块编译器观点:
final String constraintsAmount;
if(constraint.isPresent()) {
constraintsAmount = constraint.getValue();
} else {
constraintsAmount = ...
}
更妙的是三元运算符:
final String constraintsAmount = constraint.isPresent() ? constraint.getValue() : ...
注意:在Java 8,你并不需要声明一个变量final
到在“闭包”(在lambda中)使用它。
或者你可能需要重新设计你的代码。很难说,因为我没有足够的信息。
Assumimg constraint
是Optional<String>
,你可以做到以下几点:
String constraintsAmount = constraint.orElse(<somedefault>);
否则,如果你只是想要做的事,如果constraint
有一个值做到以下几点:
constraint.ifPresent(constraintsAmount -> { .... });
(在最后一种情况下,您显然不需要声明'constraintsAmount'变量。) –
局部变量有在被使用之前被明确地初始化。
您的问题不是特定于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();
要么,在else
语句值constraintsAmount
。
或删除final
以给变量赋予默认值。
问题 - 当约束不存在时会发生什么? –
@BoristheSpider是的,我明白为什么它给错误,因为如果约束不存在变量不会被初始化。那么解决这个问题的工作是什么? – tushR
@tushR我们不能告诉你。当'constraint'不存在时,你必须决定你想要发生什么。你没有告诉我们。 –