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

时间:2019-02-06 10:48:37

标签: java lambda completable-future

我有此代码可以正常工作:

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以使用import * as Dropzone from 'dropzone'; // If you want to disable autodiscover, do: //Dropzone.autoDiscover = false; // Or if you want to configure a specific form, just replace formId below with your form ID: Dropzone.options.formId = { // .... }; ,如下所示:

Conditional Operator

或使用if语句:

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

答案 2 :(得分: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";
}

该方法的优点是您可以添加更复杂的条件,并且可以在以后更改此逻辑而不会影响原始流程。