2017-10-04 7 views
0

以下のシナリオがあります。条件に基づいて最終変数を宣言し、Javaのラムダで使用する

ラムダ式の中で変数を使用したいと思います。しかし、この変数は、条件に基づいて一度の価値(最終)を持つことになります。

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

これ以降、forEach + lambda式を使用してリストを反復処理します。 これで、この繰り返し内でこのconstraintsAmountフィールドを使用する必要があります。

しかし、 "constraintsAmountが初期化されていない可能性があります"と表示されます。

どうすればこの問題を回避できますか。

注:この変数をインスタンス変数として宣言する必要はありません。この変数を宣言して初期化する必要はありません。 2)それは最終的なものなので、それを初期化して、ifチェックの中で再利用します。そこで、何が問題になっているのかを確認したかったのです。あなたが他のブロックを必要とするコンパイラの観点から

+0

質問 - 'constraint'がないとどうなりますか? –

+0

@BoristheSpiderはい私は制約が存在しない変数が初期化されないので、なぜエラーを出しているのか理解しています。では、これを解決するための回避策は何でしょうか。 – tushR

+0

@tushR私たちはそれを伝えることはできません。 'constraint'が存在しないときにあなたが何をするのかを決める必要があります。あなたはそれを私たちに語ったことはありません。 –

答えて

1

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

さらに良い三項演算子:

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

注:Java 8では、変数finalに宣言する必要はありません。 "閉鎖"(ラムダの中)で使用してください。

コードを再設計する必要があるかもしれません。私は十分な情報がないので、伝えにくいです。

0

Assumimg constraintでは、次の操作を行うことができOptional<String>次のとおりです。

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

そうでない場合は、あなただけconstraintが値を持っている場合は何かをしたい場合は、次の操作を行います。

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

(最後のケースでは 'restrictAmount'変数を明示的に宣言する必要はありません)。 –

0

ローカル変数があります使用する前に明示的に初期化する必要があります。
問題は、final修飾子またはラムダ式の使用に固有の問題ではありません。

この条件が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を削除して、変数にデフォルト値を指定します。

関連する問題