1
votes

CompletableFuture.runAsync (() -> ... avec une variable non finale

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


4 commentaires

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 lambda nom [0] .


CompletableFuture.completedFuture (name) .thenApplyAsync (this :: doX) utilisez ClassName :: doX si doX est static , utilisez thenAcceptAsync si doX est void .


3 Réponses :


0
votes

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


0 commentaires

2
votes

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>


2 commentaires

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)



0
votes

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.


0 commentaires