回答
由多個語句組成的長lambda表達式可能會減少代碼的可讀性的。在這種情況下,提取方法中的這些語句並引用它可能是更好的選擇。
其他原因可能是重新使用性。您可以構建一個方法並從代碼的不同位置調用它,而不是複製&粘貼您的幾個語句的lambda表達式。
比較:'houses.map(House :: getName)'和'houses.map(h - > h.getName())'。拉姆達減少了兩個字符。的確,類型並不明確,但任何IDE都會告訴你,而且當類型明顯時,應該使用lambda。我可能會同意你的可重用性,但lambda恰好很小,所以它們可以被鏈接而不是創建大的特定方法。從這個意義上說,小方法比一些大而複雜的方法更具可重用性,並且由於lambda的清晰性(在一定程度上,冗長),它們仍然易於閱讀。 – Gerard
我和傑拉德在一起。當你移出代碼時,可讀性實際上會受到影響,所以你必須跳到它才能繼續閱讀,然後跳回去。您*希望*將所有相關的代碼放在同一個地方。另外,'House'是一個非常好的例子。 「ThreeStoryRedBrickHouseWithBlueDoors」呢。我更喜歡多參數lambdas的方法引用,有時強調lambda只是關於單個方法調用。使用方法引用時出錯的可能性會更小:您可能會拼錯使用網站中的參數,意外地引用來自外部作用域的變量等。 –
@Gerard我不同意您的第一條語句。如果您使用的描述方法名稱很好,並且如果您提取大量代碼,則移動代碼可提高可讀性。如果您使用混淆方法名稱,我同意你的看法。 – Torsten
這個問題可能會(也應該)關閉,主要是基於意見的。但是,在此之前,讓我提供一些關於爲什麼我們將此功能添加到語言中的一些觀點,當我們明確地沒有嚴格需要時(所有方法參考都可以表示爲lambda表達式)。
請注意,有沒有正確的答案。任何人都說「總是使用方法ref而不是lambda」或「總是使用lambda而不是方法ref」應該被忽略。
這個問題在精神上非常類似於「我應該何時使用命名類與匿名類」?答案是一樣的:當你發現它更具可讀性。肯定有一種情況肯定是一種情況,或者肯定是另一種情況,但中間有一些灰色,必須使用判斷。
方法參考背後的理論很簡單:名稱問題。如果一個方法有一個名字,那麼通過名字引用它,而不是通過一個最終轉向並調用它的命令行代碼,通常(但並非總是)更清晰可讀。
關於表演或計算角色的論點大多是紅鯡魚,你應該忽略它們。目標是編寫清晰的代碼。在這個度量標準中,經常(但並非總是)方法參考,因此我們將它們作爲選項包含在這些情況中。
關於方法參考是否澄清或混淆意圖的一個關鍵考慮因素是從上下文中顯而易見的是,被表示的函數的形狀是什麼。在某些情況下(例如,map(Person::getLastName)
,從上下文中可以清楚地看出,需要一個將某個事物映射到另一個事物的函數,並且在這種情況下,方法引用變得光芒四射。另一些情況下,使用方法ref需要讀者去了解正在描述一種函數;這是一個警告信號,即lambda可能更具可讀性,即使更長。
最後,我們發現大多數人最初是,因爲它們遠離方法參考,因爲他們覺得比lambda更新,更怪,所以最初覺得它們「不易讀」,但隨着時間的推移,當他們習慣了語法時,通常會改變它們的行爲,並儘可能地吸引方法參考。主觀的最初「不太可讀」的反應幾乎肯定需要家庭成員的某些方面y偏見,你應該給自己一個機會,讓他們在提出文體觀點之前對兩者都感到滿意。
- 1. 與方法,用升壓lambda表達式
- 2. 匿名方法與lambda表達式
- 3. SONAR:用帶字符串參數的方法參考替換lambda表達式
- 4. Lambda表達式與表達
- 5. 與lambda表達式
- 6. 與lambda表達式
- 7. 如何調用參考變量的方法與表達式樹
- 8. C++與lambda表達式作爲參數
- 9. 查詢表達式與Lambda表達式
- 10. 計算方差與VB.NET lambda表達式
- 11. 與方法參考
- 12. Lambda表達與匿名方法
- 13. lambda表達式中的替換方法
- 14. lambda表達式vs靜態方法
- 15. Lambda表達式返回方法?
- 16. 擴展方法和lambda表達式
- 17. C++ lambda表達式的方法鏈
- 18. 與C++ 11 lambda表達式
- 19. LINQ與Lambda表達式
- 20. C#:與Lambda表達式
- 21. C++與lambda表達式
- 22. Moq與lambda表達式?
- 23. 錯誤與Lambda表達式
- 24. 參考命名錶達式
- 25. 參考現有表達式
- 26. 參考Lambda表達式中的私有屬性?
- 27. 如何將lambda表達式傳遞給期望lambda表達式的方法?
- 28. 將lambda表達式作爲參數傳遞給方法?
- 29. C#將Lambda表達式作爲方法參數
- 30. C#關於lambda表達式作爲方法參數
它只是一樣的東西,但是你不覺得像'files.stream()。map(File :: getName)'這樣漂亮嗎? –
不是,我沒有看到任何物體!它看起來像一個靜態的電話給我 – Gerard
「看起來像」在這裏不是一個爭論,我想。 –