簡體   English   中英

Java Lambda vs方法參考-一個不接收調用方的本地變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM