2017-10-04 14 views
0

J'ai le scénario ci-dessous.Déclarez une variable finale basée sur une condition et utilisez-la en lambda dans Java

Je voudrais utiliser une variable à l'intérieur de l'expression lambda. Mais cette variable aura une valeur ponctuelle (finale) basée sur une condition. Après cela, je commence l'itération sur une liste en utilisant l'expression forEach + lambda. Maintenant, je dois utiliser ce champ constraintsAmount à l'intérieur de cette itération.

Mais il est dit que "constraintsAmount n'a peut-être pas été initialisé".

Comment puis-je contourner celui-ci.

Note: 1) Je ne veux pas déclarer cette variable comme une variable d'instance et je ne veux certainement pas déclarer et initialiser cette variable dans l'itération. 2) Puisqu'il s'agit d'une finale, je ne peux pas l'initialiser et ensuite la réutiliser dans la vérification if. Donc voulu vérifier quel est le travail autour.

+0

Question - que se passe-t-il lorsque 'contrainte 'n'est pas présent? –

+0

@BoristheSpider Oui je comprends pourquoi il donne l'erreur, puisque si la contrainte n'est pas présente la variable ne sera pas initialisée. Alors, quel est le travail autour de résoudre cela. – tushR

+0

@tushR nous ne pouvons pas vous le dire. Vous devez décider de ce que vous voulez arriver quand 'contrainte 'n'est pas présent. Vous ne nous l'avez pas dit. –

Répondre

1

Du point de vue du compilateur que vous avez besoin d'un autre bloc:

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

Mieux encore l'opérateur ternaire:

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

REMARQUE: Java 8 vous n'avez pas besoin de déclarer une final variable Utilisez-le dans une "fermeture" (à l'intérieur de choses lambda). Ou peut-être que vous pourriez avoir besoin de repenser votre code complètement. Difficile à dire car je n'ai pas assez d'informations.

0

Assumimg constraint est un Optional<String> vous pouvez effectuer les opérations suivantes:

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

Sinon, si vous voulez seulement faire quelque chose si constraint a une valeur, procédez comme suit:

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

(dans le dernier cas, vous n'avez évidemment pas besoin de déclarer la variable 'contraintesAmount'.) –

0

Une variable locale a être explicitement initialisé avant d'être utilisé.
Votre problème n'est pas spécifique au modificateur final ou à l'utilisation d'une expression lambda.

Si cette condition est true: if(constraint.isPresent()) {, constraintsAmount est initialisé. Mais dans le cas contraire, il n'est pas initialisé. Donc, si vous utilisez cette variable, le compilateur ne l'accepte pas.

Ce code illustre le problème:

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(); 

Soit, la valeur constraintsAmount dans une déclaration else.
Ou supprimer final pour donner une valeur par défaut à la variable.