2014-06-30 129 views
61

IntelliJ不斷提議我用方法引用替換我的lambda表達式。Lambda表達式與方法參考

他們之間有沒有任何客觀的區別?

+1

它只是一樣的東西,但是你不覺得像'files.stream()。map(File :: getName)'這樣漂亮嗎? –

+4

不是,我沒有看到任何物體!它看起來像一個靜態的電話給我 – Gerard

+0

「看起來像」在這裏不是一個爭論,我想。 –

回答

7

由多個語句組成的長lambda表達式可能會減少代碼的可讀性的。在這種情況下,提取方法中的這些語句並引用它可能是更好的選擇。

其他原因可能是重新使用性。您可以構建一個方法並從代碼的不同位置調用它,而不是複製&粘貼您的幾個語句的lambda表達式。

+1

比較:'houses.map(House :: getName)'和'houses.map(h - > h.getName())'。拉姆達減少了兩個字符。的確,類型並不明確,但任何IDE都會告訴你,而且當類型明顯時,應該使用lambda。我可能會同意你的可重用性,但lambda恰好很小,所以它們可以被鏈接而不是創建大的特定方法。從這個意義上說,小方法比一些大而複雜的方法更具可重用性,並且由於lambda的清晰性(在一定程度上,冗長),它們仍然易於閱讀。 – Gerard

+8

我和傑拉德在一起。當你移出代碼時,可讀性實際上會受到影響,所以你必須跳到它才能繼續閱讀,然後跳回去。您*希望*將所有相關的代碼放在同一個地方。另外,'House'是一個非常好的例子。 「ThreeStoryRedBrickHouseWithBlueDoors」呢。我更喜歡多參數lambdas的方法引用,有時強調lambda只是關於單個方法調用。使用方法引用時出錯的可能性會更小:您可能會拼錯使用網站中的參數,意外地引用來自外部作用域的變量等。 –

+0

@Gerard我不同意您的第一條語句。如果您使用的描述方法名稱很好,並且如果您提取大量代碼,則移動代碼可提高可讀性。如果您使用混淆方法名稱,我同意你的看法。 – Torsten

95

這個問題可能會(也應該)關閉,主要是基於意見的。但是,在此之前,讓我提供一些關於爲什麼我們將此功能添加到語言中的一些觀點,當我們明確地沒有嚴格需要時(所有方法參考都可以表示爲lambda表達式)。

請注意,有沒有正確的答案。任何人都說「總是使用方法ref而不是lambda」或「總是使用lambda而不是方法ref」應該被忽略。

這個問題在精神上非常類似於「我應該何時使用命名類與匿名類」?答案是一樣的:當你發現它更具可讀性。肯定有一種情況肯定是一種情況,或者肯定是另一種情況,但中間有一些灰色,必須使用判斷。

方法參考背後的理論很簡單:名稱問題。如果一個方法有一個名字,那麼通過名字引用它,而不是通過一個最終轉向並調用它的命令行代碼,通常(但並非總是)更清晰可讀。

關於表演或計算角色的論點大多是紅鯡魚,你應該忽略它們。目標是編寫清晰的代碼。在這個度量標準中,經常(但並非總是)方法參考,因此我們將它們作爲選項包含在這些情況中。

關於方法參考是否澄清或混淆意圖的一個關鍵考慮因素是從上下文中顯而易見的是,被表示的函數的形狀是什麼。在某些情況下(例如,map(Person::getLastName),從上下文中可以清楚地看出,需要一個將某個事物映射到另一個事物的函數,並且在這種情況下,方法引用變得光芒四射。另一些情況下,使用方法ref需要讀者去了解正在描述一種函數;這是一個警告信號,即lambda可能更具可讀性,即使更長。

最後,我們發現大多數人最初是,因爲它們遠離方法參考,因爲他們覺得比lambda更新,更怪,所以最初覺得它們「不易讀」,但隨着時間的推移,當他們習慣了語法時,通常會改變它們的行爲,並儘可能地吸引方法參考。主觀的最初「不太可讀」的反應幾乎肯定需要家庭成員的某些方面y偏見,你應該給自己一個機會,讓他們在提出文體觀點之前對兩者都感到滿意。

+28

我問是否有差異,而不是我應該使用一個或另一個選項。 – Gerard

+21

@Gerard謝謝你會是一個更好的答案。 –

+0

@Gerard聽起來Brian在說「不,沒有」 – dj18