[英]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
或有效的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";
}
這種方法的優點是您可以添加更復雜的條件,並且可以在以后更改此邏輯而不會影響原始流程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.