Understand Lambda Expressions in 3 minutes(翻译)
本文翻譯自CodeProject上的一篇簡單解釋Lambda表達式的文章,適合新手理解。譯文后面我補充了一點對Lambda表達式的說明。
1.什么是Lambda表達式?
Lambda表達式是一種匿名方法,多數(shù)情況下用來在LINQ中快速創(chuàng)建委托。簡單地說,它代表一個沒有被定義過的方法,比如沒有訪問修飾符、沒有返回值聲明也沒有方法名稱。
2.我們?yōu)槭裁葱枰狶ambda表達式?(為什么我們需要定義一個沒有方法名的方法?)
為了更方便。Lambda表達式允許你在調(diào)用方法的地方去定義該方法的實現(xiàn)。當一個方法非常簡短,并且它只會被使用到過一次時,使用Lambda表達式非常節(jié)省時間,因為這時候我們可以不用單獨地去定義這個方法。
優(yōu)點:
- 減少碼字。Lambda表達式不要求指定方法的修飾符、返回值類型以及方法名;
- 方便代碼閱讀。使用Lambda表達式后,被調(diào)用方法的具體實現(xiàn)就在調(diào)用處,因此不需要去其他地方到處找方法的具體定義。
Lambda表達式應(yīng)該是短小的,不應(yīng)該是復(fù)雜的代碼,否則代碼看起來比較亂,不易讀懂。
3.怎樣定義一個Lambda表達式?
Lambda表達式基本定義:參數(shù)列表 => 執(zhí)行代碼。(如 (a,b) => {return a+b;},譯者注)
簡單例子
?
- n是輸入?yún)?shù)
- n%2 == 1是執(zhí)行代碼
你可以將以上代碼理解為:輸入一個名為n的參數(shù)給一個匿名方法,如果輸入?yún)?shù)是奇數(shù),那么匿名方法會返回true。
以上代碼中,將Lambda表達式作為參數(shù)傳遞。
(3分鐘結(jié)束,譯者注)
?
譯者補充:
.NET中Lambda表達式的引入主要是為了在編程中增添“函數(shù)式編程”的風格,Java8中也引進了Lambda表達式,可見函數(shù)式編程已經(jīng)越來越受歡迎。
嚴格意義上講(非實際),一個Lambda表達式應(yīng)該必須具備輸入?yún)?shù)和返回值,也就是說,Lambda表達式的格式應(yīng)該是這樣的:
(參數(shù)列表) =>{執(zhí)行代碼;返回值}
上面參數(shù)列表不能是空的,最后也必須有返回值。這樣規(guī)定是為了與“數(shù)學函數(shù)”的定義對應(yīng)(有自變量,有因變量,并且每個輸入有且僅有一個輸出與之對應(yīng))。那么為什么.NET中的Lambda表達式允許我們的參數(shù)列表為空,并且可以沒有返回值呢?這個主要原因是.NET雖然引入了“函數(shù)式編程”風格,但是并沒有拋棄原來命令式編程風格,也就是說,現(xiàn)在它是一種混合式編程風格。事實上,越來越多“命令式風格”的語言引入了“函數(shù)式風格”,最終都變?yōu)榱嘶旌鲜骄幊田L格。有關(guān)函數(shù)式編程、命令式編程、數(shù)學函數(shù)等概念,請參見我這篇博客:
函數(shù)式編程(一)認識“編程范式”和“函數(shù)”
另外我再舉兩個例子說明Lambda表達式的作用:
1.在方法調(diào)用處定義方法的實現(xiàn)
1 int a = 1; 2 int b = 2; 3 int c = ((Func<int, int, int>)((arg1, arg2) => { return arg1 + arg2; }))(a, b); //現(xiàn)場定義現(xiàn)場調(diào)用 4 Console.WriteLine("c is " + c); 5 Console.Read();如上代碼中,我們并沒有單獨定義一個方法來計算兩個整數(shù)的和,而是在需要用到的時候現(xiàn)場使用Lambda表達式去定義。
注:(arg1,arg2)=>{rerurn arg1+arg2;}與(arg1,arg2)=>arg1+arg2的效果是一樣的,前者更為通用,當表達式中有多行代碼時,必須使用花括號。
2.將代碼塊以參數(shù)的形式進行傳遞
使用Lambda表達式時,我們可以快速創(chuàng)建委托,進而將創(chuàng)建的委托作為參數(shù)進行傳遞。
List<int> list1 = new List<int>{1,2,3}; List<int> list2 = list1.where(n=>n%2==0).toList();如上代碼中,我們將代碼塊“n=>n%2==0”(可以比這更為復(fù)雜)作為參數(shù)傳遞給擴展方法List<T>.Where。實際上,這里是通過Lambda表達式快速創(chuàng)建了一個委托。不僅僅是.NET中有這種寫法,具備函數(shù)式編程風格的JavaScript中同樣有類似寫法:
$.ajax({type: "POST",url: "http://localhost:10647/ ",data: JSON.stringify(Customer),contentType: "application/json; charset=utf-8",dataType: "json",success: function (data, status, jqXHR){alert(data);},error: function (xhr){alert(xhr.responseText);}});如上代碼中,給$.ajax方法的success和error傳遞的均是匿名函數(shù)(代碼塊),如果$.ajax方法在C#中也存在,那么參數(shù)列表中的success參數(shù)完全可以這樣寫:
success:(data,status,jqXHR)=>alert(data),或者這樣寫:
success:delegate(type1 data,type2 status,type3 jqXHR) //type1 type2 type3 為數(shù)據(jù)類型 {alert(data);},這里,Lambda表達式與使用delegate關(guān)鍵字創(chuàng)建匿名方法的效果是一樣的。
3.委托、命名方法、匿名方法以及Lambda表達式的關(guān)系
網(wǎng)上對于這三者的比較比較多,其實后面三個都是創(chuàng)建委托的一種方式,只是一個比一個簡潔(這很符合技術(shù)發(fā)展,哦NO,:)不要再黑“語法糖”了)。如果把委托比作int,那么命名方法、匿名方法以及Lambda表達式可以看作1、2以及3。它們就是這種關(guān)系。
?
作者:周見智?
出處:http://www.cnblogs.com/xiaozhi_5638/?
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權(quán)利。
本文轉(zhuǎn)自周見智博客博客園博客,原文鏈接:http://www.cnblogs.com/xiaozhi_5638/p/4140586.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的Understand Lambda Expressions in 3 minutes(翻译)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java多线程安全解决方案_java常用
- 下一篇: [Intel Edison开发板] 02