CompletableFuture.runAsync(() ->... 带有非最终变量

CompletableFuture.runAsync(() ->... with a non-final variable

我的代码运行良好:

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 变量

的逻辑

lambda 表达式需要一个最终变量。如果初始化代码足够复杂,那么定义一个新的最终变量。

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

你可以使用 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));

尝试将解析器逻辑与主流解耦:

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

这种方法的优点是您可以添加更复杂的条件,并且可以稍后更改此逻辑而无需触及原始流程。