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";
}
这种方法的优点是您可以添加更复杂的条件,并且可以稍后更改此逻辑而无需触及原始流程。
我的代码运行良好:
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";
}
这种方法的优点是您可以添加更复杂的条件,并且可以稍后更改此逻辑而无需触及原始流程。