[英]Java Lambda vs Method Reference - One does not receive the local vars of the caller
嘗試從lambda重構為方法引用時,我意識到方法引用似乎沒有獲取調用者的局部變量(詞法作用域?)的區別。 當使用lambda作為內聯代碼時,根本沒有問題。
public class MethodRef {
public static void main(String[] args) {
String appender = "I am appended";
//possible
appender("Hello! ", former -> {
StringBuilder builder = new StringBuilder(former);
builder.append(appender);
System.out.println(builder.toString());
});
//not possible
appender("Hello! ", this::theRef);
}
//Delegater
public static void appender(String former, Consumer<String> consumer){
consumer.accept(former);
}
//Method Ref
public void theRef(String former){
StringBuilder builder = new StringBuilder(former);
builder.append(appender);
System.out.println(builder.toString());
}
}
我了解以下事實:該方法的參數列表不會產生任何“ appender”,但是否沒有可用於訪問調用者/消費者范圍的詞法變量的“隱藏”參數?
不,這是不可能的。
詞法范圍在編譯時解決。 該方法以通用方式編寫,可以從任何地方進行技術調用。 因此,編譯器無法猜測所有潛在調用的詞法范圍。
如果要維護單獨的方法,唯一的方法是將調用包裝為包裝lambda並將局部變量作為參數傳遞。 但是我認為這不是最初的目標。
不可以,您不能創建可以訪問方法外部局部變量的常規方法。
保留定義自定義范圍的局部變量副本的lambda名稱為closure 。
我知道在Java中使用閉包的唯一其他方法是匿名內部類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.