Understand Lambda Expressions in 3 minutes(翻譯)

本文翻譯自CodeProject上的一篇簡單解釋Lambda表達式的文章,適合新手理解。譯文後面我補充了一點對Lambda表達式的說明。html

1.什麼是Lambda表達式?ajax

Lambda表達式是一種匿名方法,多數狀況下用來在LINQ中快速建立委託。簡單地說,它表明一個沒有被定義過的方法,好比沒有訪問修飾符、沒有返回值聲明也沒有方法名稱。編程

2.咱們爲何須要Lambda表達式?(爲何咱們須要定義一個沒有方法名的方法?)json

爲了更方便。Lambda表達式容許你在調用方法的地方去定義該方法的實現。當一個方法很是簡短,而且它只會被使用到過一次時,使用Lambda表達式很是節省時間,由於這時候咱們能夠不用單獨地去定義這個方法。app

優勢:函數式編程

  • 減小碼字。Lambda表達式不要求指定方法的修飾符、返回值類型以及方法名;
  • 方便代碼閱讀。使用Lambda表達式後,被調用方法的具體實現就在調用處,所以不須要去其餘地方處處找方法的具體定義。

Lambda表達式應該是短小的,不該該是複雜的代碼,不然代碼看起來比較亂,不易讀懂。函數

3.怎樣定義一個Lambda表達式?url

Lambda表達式基本定義:參數列表 => 執行代碼。(如 (a,b) => {return a+b;},譯者注)spa

簡單例子翻譯

 

  • n是輸入參數
  • n%2 == 1是執行代碼

你能夠將以上代碼理解爲:輸入一個名爲n的參數給一個匿名方法,若是輸入參數是奇數,那麼匿名方法會返回true。

以上代碼中,將Lambda表達式做爲參數傳遞。

(3分鐘結束,譯者注)

 

譯者補充:

.NET中Lambda表達式的引入主要是爲了在編程中增添「函數式編程」的風格,Java8中也引進了Lambda表達式,可見函數式編程已經愈來愈受歡迎。

嚴格意義上講(非實際),一個Lambda表達式應該必須具有輸入參數和返回值,也就是說,Lambda表達式的格式應該是這樣的:

(參數列表) =>{執行代碼;返回值}

上面參數列表不能是空的,最後也必須有返回值。這樣規定是爲了與「數學函數」的定義對應(有自變量,有因變量,而且每一個輸入有且僅有一個輸出與之對應)。那麼爲何.NET中的Lambda表達式容許咱們的參數列表爲空,而且能夠沒有返回值呢?這個主要緣由是.NET雖然引入了「函數式編程」風格,可是並無拋棄原來命令式編程風格,也就是說,如今它是一種混合式編程風格。事實上,愈來愈多「命令式風格」的語言引入了「函數式風格」,最終都變爲了混合式編程風格。有關函數式編程、命令式編程、數學函數等概念,請參見我這篇博客:

函數式編程(一)認識「編程範式」和「函數」

另外我再舉兩個例子說明Lambda表達式的做用:

1.在方法調用處定義方法的實現

1 int a = 1;
2 int b = 2;
3 int c = ((Func<int, int, int>)((arg1, arg2) => { return arg1 + arg2; }))(a, b); //現場定義現場調用
4 Console.WriteLine("c is " + c);
5 Console.Read();

如上代碼中,咱們並無單獨定義一個方法來計算兩個整數的和,而是在須要用到的時候現場使用Lambda表達式去定義。

注:(arg1,arg2)=>{rerurn arg1+arg2;}與(arg1,arg2)=>arg1+arg2的效果是同樣的,前者更爲通用,當表達式中有多行代碼時,必須使用花括號。

2.將代碼塊以參數的形式進行傳遞

使用Lambda表達式時,咱們能夠快速建立委託,進而將建立的委託做爲參數進行傳遞。

List<int> list1 = new List<int>{1,2,3};
List<int> list2 = list1.where(n=>n%2==0).toList();

如上代碼中,咱們將代碼塊「n=>n%2==0」(能夠比這更爲複雜)做爲參數傳遞給擴展方法List<T>.Where。實際上,這裏是經過Lambda表達式快速建立了一個委託。不只僅是.NET中有這種寫法,具有函數式編程風格的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傳遞的均是匿名函數(代碼塊),若是$.ajax方法在C#中也存在,那麼參數列表中的success參數徹底能夠這樣寫:

success:(data,status,jqXHR)=>alert(data),

或者這樣寫:

success:delegate(type1 data,type2 status,type3 jqXHR)  //type1 type2 type3 爲數據類型
    {
        alert(data);
    },

這裏,Lambda表達式與使用delegate關鍵字建立匿名方法的效果是同樣的。

3.委託、命名方法、匿名方法以及Lambda表達式的關係

網上對於這三者的比較比較多,其實後面三個都是建立委託的一種方式,只是一個比一個簡潔(這很符合技術發展,哦NO,:)不要再黑「語法糖」了)。若是把委託比做int,那麼命名方法、匿名方法以及Lambda表達式能夠看做一、2以及3。它們就是這種關係。

相關文章
相關標籤/搜索