我有此代码可以正常工作:
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
变量上
答案 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";
}
该方法的优点是您可以添加更复杂的条件,并且可以在以后更改此逻辑而不会影响原始流程。