J'ai ce code qui fonctionne bien:
String name = "Oscar"; if (x){ name = "Tiger"; } CompletableFuture.runAsync(() -> doX(name));
Je dois maintenant ajouter une logique à la variable name
:
String name = "Oscar"; CompletableFuture.runAsync(() -> doX(name));
3 Réponses :
L'expression lambda a besoin d'une variable finale. Si le code d'initialisation est assez compliqué, définissez une nouvelle variable finale.
final String fName = name; CompletableFuture.runAsync(() -> doX(fName));
Vous pouvez utiliser Conditional Operator
, quelque chose comme ceci:
boolean condition = true; final String name; if(condition) { name = "Tiger"; }else { name = "Oscar"; } CompletableFuture.runAsync(() -> System.out.println(name));
Ou utiliser des instructions if:
boolean condition = true; String name = condition ? "Tiger" : "Oscar"; CompletableFuture.runAsync(() -> System.out.println(name));
p>
Vous ne pouvez pas modifier la valeur d'une variable finale. name = "Tiger" ne fonctionnera pas.
@VinayAvasthi puisqu'il ne lui a attribué aucune valeur, cela fonctionnera. vous ne pouvez attribuer une valeur à une variable finale qu'une seule fois, ce qu'il a fait (si, sinon)
Essayez de découpler la logique du résolveur du flux principal:
public static void somewhere() { // Variable even may be explicitly final final String name = resolve(true); CompletableFuture.runAsync(() -> doX(name)); } public String resolve(boolean condition) { if (condition) return "NameX"; return "NameY"; // Or: // return condition ? "NameX" : "NameY"; }
L'avantage de l'approche est que vous pouvez ajouter des conditions plus complexes et modifier cette logique ultérieurement sans toucher au flux d'origine.
Si le code est en effet exactement tel que vous l'avez écrit, vous pouvez écrire
String name = x? "Tiger": "Oscar";
- cela fera un seul initialiseur. Mais si la logique est plus compliquée, cela peut ne pas fonctionner.Ou peut-être copiez-le dans une autre variable pour le rendre définitif également.
ou pire, ne doit pas être utilisé, utilisez
String [] nom
, et dans l'utilisateur lambdanom [0]
.CompletableFuture.completedFuture (name) .thenApplyAsync (this :: doX)
utilisezClassName :: doX
sidoX
eststatic code >, utilisez
thenAcceptAsync
sidoX
estvoid
.