根据条件声明最终变量并在java中使用lambda表达式

问题描述:

我有以下情形。根据条件声明最终变量并在java中使用lambda表达式

我想在lambda表达式中使用一个变量。但是这个变量将有一个基于条件的一次性值(最终)。

final String constraintsAmount; 
    if(constraint.isPresent()) { 
     constraintsAmount = constraint.getValue(); 
    } 

在此之后,我开始迭代使用forEach + lambda表达式的列表。 现在我必须在这个迭代中使用这个constraintsAmount字段。

但它表示“constraintsAmount可能未被初始化”。

我该如何解决这个问题。

注意: 1)我不想声明这个变量作为一个实例变量,我当然不想在迭代中声明和初始化这个变量。 2)由于它是最后我不能初始化它,然后在if检查中重新使用它。所以想要检查什么是工作。

+0

问题 - 当约束不存在时会发生什么? –

+0

@BoristheSpider是的,我明白为什么它给错误,因为如果约束不存在变量不会被初始化。那么解决这个问题的工作是什么? – tushR

+0

@tushR我们不能告诉你。当'constraint'不存在时,你必须决定你想要发生什么。你没有告诉我们。 –

从你需要一个else块编译器观点:

final String constraintsAmount; 
    if(constraint.isPresent()) { 
    constraintsAmount = constraint.getValue(); 
    } else { 
    constraintsAmount = ... 
    } 

更妙的是三元运算符:

final String constraintsAmount = constraint.isPresent() ? constraint.getValue() : ... 

注意:在Java 8,你并不需要声明一个变量final到在“闭包”(在lambda中)使用它。

或者你可能需要重新设计你的代码。很难说,因为我没有足够的信息。

Assumimg constraintOptional<String>,你可以做到以下几点:

String constraintsAmount = constraint.orElse(<somedefault>); 

否则,如果你只是想要做的事,如果constraint有一个值做到以下几点:

constraint.ifPresent(constraintsAmount -> { .... }); 
+0

(在最后一种情况下,您显然不需要声明'constraintsAmount'变量。) –

局部变量有在被使用之前被明确地初始化。
您的问题不是特定于final修饰符或使用lambda表达式。

如果这个条件是trueif(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以给变量赋予默认值。