我有这样的代码工作正常:
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
变量的逻辑不同的编写代码的方式
您可以使用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));
lambda表达式需要一个最后的变量。如果初始化代码是够复杂的再定义一个新的最后一个变量。
final String fName = name;
CompletableFuture.runAsync(() -> doX(fName));
尝试从主流动解耦分解器逻辑:
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";
}
你可以添加更多复杂的情况,以后可以改变这一逻辑而不需要修改流方法的优点。