2017-10-04 24 views
0

我有以下情形。根據條件聲明最終變量並在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'不存在時,你必須決定你想要發生什麼。你沒有告訴我們。 –

回答

1

從你需要一個else塊編譯器觀點:

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

更妙的是三元運算符:

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

注意:在Java 8,你並不需要聲明一個變量final到在「閉包」(在lambda中)使用它。

或者你可能需要重新設計你的代碼。很難說,因爲我沒有足夠的信息。

0

Assumimg constraintOptional<String>,你可以做到以下幾點:

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

否則,如果你只是想要做的事,如果constraint有一個值做到以下幾點:

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

(在最後一種情況下,您顯然不需要聲明'constraintsAmount'變量。) –

0

局部變量有在被使用之前被明確地初始化。
您的問題不是特定於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以給變量賦予默認值。