CompletableFuture.runAsync (() -> ... с неконечной переменной - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть этот код, который отлично работает:

String name = "Oscar";
CompletableFuture.runAsync(() -> doX(name));

Теперь мне нужно добавить немного логики в переменную name:

String name = "Oscar";
if (x){
  name = "Tiger";
}
CompletableFuture.runAsync(() -> doX(name));

Но теперь компилятор жалуется на Variable used in lambda expression should be final or effectively final

Я понимаю из постов типа этот , что name должно быть final или эффективно финальным, но мне интересно, есть ли способ написать код по-другому, чтобывключить логику для переменной name

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Вы можете использовать Conditional Operator, что-то вроде этого:

        boolean condition = true;
        String name = condition ? "Tiger" : "Oscar";
        CompletableFuture.runAsync(() -> System.out.println(name));

Или использовать операторы if:

 boolean condition = true;
    final String name;
    if(condition) {
        name = "Tiger";
    }else {
        name = "Oscar";
    }
    CompletableFuture.runAsync(() -> System.out.println(name));
0 голосов
/ 06 февраля 2019

Попробуйте отделить логику резольвера от основного потока:

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";
}

Преимущество такого подхода заключается в том, что вы можете добавлять более сложные условия и позже изменять эту логику, не касаясь исходного потока.

0 голосов
/ 06 февраля 2019

Лямбда-выражению нужна конечная переменная.Если код инициализации достаточно сложен, определите новую конечную переменную.

final String fName = name;
CompletableFuture.runAsync(() -> doX(fName));
...