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

问题描述 投票:0回答:3

我有这样的代码工作正常:

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

我从喜欢this one职位的name必须final或有效最终明白,但我不知道如果有,以使在name变量的逻辑不同的编写代码的方式

java lambda completable-future
3个回答
1
投票

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

1
投票

lambda表达式需要一个最后的变量。如果初始化代码是够复杂的再定义一个新的最后一个变量。

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

0
投票

尝试从主流动解耦分解器逻辑:

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

你可以添加更多复杂的情况,以后可以改变这一逻辑而不需要修改流方法的优点。

© www.soinside.com 2019 - 2024. All rights reserved.