簡體   English   中英

Java 8 中的實例方法引用類型有什么區別?

[英]What's the difference between instance method reference types in Java 8?

因此 Java 8 引入了方法引用,並且文檔描述了這四種類型

我的問題是這兩種實例類型有什么區別?

  1. 對特定對象的實例方法的引用。
  2. 對特定類型的任意對象的實例方法的引用。

兩者都引用了參考文獻,但有什么顯着不同? 是不是用於解決它們的類型推斷不同? (在他們的例子中)一個是閉包而另一個是 lambda 是否重要? 它與方法上的參數數量有關嗎?

  1. myString::charAt將接受一個int並返回一個char ,並且可能用於任何以這種方式工作的 lambda。 它本質上轉換為index -> myString.charAt(index)

  2. String::length將接受一個String並返回一個int 它本質上轉換為string -> string.length()

  3. String::charAt將轉換為(string, index) -> string.charAt(index)

有了這個,他們意味着你有以下幾點:

1) 例如可以是this::someFunction; ,這將返回當前對象的someFunction引用。

2) 可以是例如String::toUpperCase ,這通常會返回StringtoUpperCase方法。

我不確定行為是否存在實際差異,我認為就像您也可以對實例變量調用靜態方法一樣。

我把我來到這里的結論寫了下來,下面是一個總結。

Oracle 描述了四種方法參考如下。

在此處輸入圖片說明

他們應該寫的是:

在此處輸入圖片說明

我發現他們對前兩個的描述令人困惑(“對靜態方法的引用”和“對特定對象的實例方法的引用”),我認為它確實是類 static對象之間的區別。

我更願意將第一個視為提前已知的特定對象的實例方法,將第二個視為稍后將提供的任意對象的實例方法。 有趣的是,這意味着第一個是閉包,第二個是 lambda。 一個是綁定的,另一個是未綁定的。

關閉某物(閉包)和不關閉某物(lambda)的方法引用之間的區別可能有點學術性,但至少它是比 Oracle 無用的描述更正式的定義。 如果您對閉包和 lambda 之間的區別感興趣,請查看這篇文章

概括

兩種類型的實例方法引用之間的區別很有趣,但基本上是學術性的。 有時,您需要傳入一些東西,有時,lambda 的用法將為您提供。 我的抱怨是 Oracle 的文檔。 他們對這種區別有很大的了解,但未能以易於理解的方式對其進行描述。 這是規范的參考資料,但很容易讓人困惑。

寫的還有一兩個微妙之處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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