Understand Lambda Expressions in 3 minutes(翻譯)

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

1.什么是Lambda表達式?

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

2.我們為什么需要Lambda表達式?(為什么我們需要定義一個沒有方法名的方法?)

為了更方便。Lambda表達式允許你在調用方法的地方去定義該方法的實現。當一個方法非常簡短,并且它只會被使用到過一次時,使用Lambda表達式非常節省時間,因為這時候我們可以不用單獨地去定義這個方法。

優點:

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

Lambda表達式應該是短小的,不應該是復雜的代碼,否則代碼看起來比較亂,不易讀懂。

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

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

簡單例子

?

  • 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表達式可以看作1、2以及3。它們就是這種關系。

?

作者:周見智?
出處:http://www.cnblogs.com/xiaozhi_5638/?
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

分類:?E文翻譯

本文轉自周見智博客博客園博客,原文鏈接:http://www.cnblogs.com/xiaozhi_5638/p/4140586.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hibernate二級緩存配置

一、定義&#xff1a; 二級緩存是進程或集群范圍內的緩存&#xff0c;可以被所有的Session共享&#xff0c;是可配置的插件 二、二級緩存原理圖 解析&#xff1a;每次從二級緩存中取出的對象&#xff0c;都是一個新的對象。 三、配置步驟如下&#xff1a; 同理&#xff1a;以員…

redis配置主從沒效果_跟我一起學Redis之加個哨兵讓主從復制更加高可用

Redis哨兵(Sentinel)其實本質就是一個RedisServer節點&#xff0c;通過設置 運行模式 來開啟哨兵的功能&#xff1b;主要功能如下&#xff1a;監控(Monitoring )&#xff1a;哨兵節點會不斷地檢查的主服務和從服務的運行狀態&#xff1b;自動故障遷移(Automatic failover) &…

閏秒導致MySQL服務器的CPU sys過高

今天&#xff0c;有個哥們碰到一個問題&#xff0c;他有一個從庫&#xff0c;只要是啟動MySQL&#xff0c;CPU使用率就非常高&#xff0c;其中sys占比也比較高&#xff0c;具體可見下圖。 注意&#xff1a;他的生產環境是物理機&#xff0c;單個CPU&#xff0c;4個Core。 于是&…

position定位——讓人又愛又恨的屬性

關于css中的position這個屬性&#xff0c;在使用的時候&#xff0c;有時很強大&#xff0c;有時又讓人很無奈。 強大的時候&#xff0c;對于div中的一些小物件不方便使用margin或者padding的時候&#xff0c;給與position:absolute;再配備left、right、top和bottom&#xff0c;…

CentOS 6.8安裝Python2.7.13

轉載自&#xff1a;http://www.cnblogs.com/94YY/p/6224441.html查看當前系統中的 Python 版本python --version返回 Python 2.6.6 為正常。檢查 CentOS 版本cat /etc/redhat-release返回 CentOS release 6.8 (Final) 為正常。安裝所有的開發工具包yum groupinstall -y "D…

新安裝數據庫sqlserver2008r2,使用javaweb連接不上問題處理

鼠標右鍵【計算機】--》【管理】&#xff0c;打開界面如下&#xff1a; 選擇自己數據庫的實例名&#xff1a; 選擇TCP/IP&#xff1a;右鍵【屬性】&#xff0c;將所有TCP動態端口的【0】刪掉&#xff0c;TCP端口設為1433&#xff1b;重啟服務&#xff0c;即可連接。PS:不知道這…

vue 鼠標點擊事件_VBA代碼解決方案第115講:點擊鼠標實現精準控制觸發事件的VBA代碼第二方案...

大家好&#xff0c;我們今日繼續講解VBA代碼解決方案的第115講內容&#xff1a;工作表事件中&#xff0c;根據Target參數不同&#xff0c;實現精準控制觸發事件的VBA代碼第二方案。在上一講中我們講了利用Address的屬性實現控制觸發事件的方案&#xff0c;今日講解第二方案&…

mysql注入5.0以上_[Injection]對MYSQL 5.0服務器以上版本注入

How to do a SQL Injection for MYSQL Server 5.01. Find a vulnerable add a ‘ at the end of the site example: news.php?id1 add a ‘ at the end of the 1 and see if you get a syntax error2. order by #–Keep upping the # until you get an error.3. union all sel…

動態規劃(制表法)模板及應用

int cache[100][100] 初始化為全體為 -1&#xff0c;這樣在 cache 中存儲的可以是其他任意非負整數&#xff0c;也可以是布爾類型 0/1 &#xff08;true/false&#xff09;&#xff0c;1. 模板 int cache[2500][2500];// 初始化為 -1&#xff0c;memset(cache, -1, sizeof(cach…

(翻譯)31天Windows Phone學習-1-項目模板

今天在在外文網站Google關于Windows Phone 7的學習資料&#xff0c;無疑間Google到了Jeff Blankenburg的 31 Days of Windows Phone這個系列&#xff0c;感覺寫的比較基礎和淺顯易懂&#xff0c;適合我這種入們級的人學習&#xff0c;所以準備拿來對Windows Phone 7的簡單入門學…

Mssql 跨域查詢

有數據庫test1和數據庫test2。其中test1中有表 table1、table2&#xff1b;test2 中有表 table1。三個表的字段都為為&#xff1a;id、xingming、shijian、shuliang。接下來我們就以上面的條件為例來介紹跨數據庫查詢和跨表 查詢的方法。 SELECT * FROM OPENROWSET(sqloledb…

arch mysql日志位置_MySQL 日志文件與相關參數

1 、參數文件及mysql參數查看mysql 的 my.cnf 配置文件位置命令&#xff1a;>./bin/mysql --help | grep my.cnf查看mysql 的參數設置命令&#xff1a; mysql > show variables --顯示所有參數; // show variables like log_error% 顯示某匹配參數mysql > select se…

MOSS點滴(2):自定義Application Page

在MOSS中后臺管理的頁面都是Application Page&#xff0c;比如網站設置的頁面(settings.aspx)就是典型的Application Page&#xff0c;它不能被Sharepoint Desiger定制。如果我們要修改只能手動的使用其他工具來修改&#xff0c;我們也可以添加Application Page&#xff0c;必須…

wpf使用webbrowser時提示當前頁面腳本發生錯誤_win7系統internet腳本錯誤的應對辦法...

最近有win7系統用戶反饋&#xff0c;上網時遇到ie瀏覽器總會提示internet腳本錯誤的問題&#xff0c;不知如何解決&#xff0c;為此非常苦惱&#xff0c;那么win7系統提示internet腳本錯誤怎么辦呢?就此問題&#xff0c;下面小編教你win7系統internet腳本錯誤的應對辦法。有不…

JDK的目錄結構及結構圖

-bin目錄: JDK開發工具的可執行文件 -lib目錄: 開發工具使用的歸檔包文件 -jre: Java 運行時環境的根目錄&#xff0c;包含Java虛擬機&#xff0c;運行時的類包和Java應用啟動器&#xff0c; 但不包含開發環境中的開發工具 -demo: 含有源代碼的程序示例 -include: 包含…

java9-1.類,抽象類,接口的綜合小練習

1 /*2 教練和運動員案例(學生分析然后講解)3 乒乓球運動員和籃球運動員。4 乒乓球教練和籃球教練。5 為了出國交流&#xff0c;跟乒乓球相關的人員都需要學習英語。6 請用所學知識&#xff1a;7 分析&#xff0c;這個案例中有哪些抽象類&#xff0c;哪些接…

java發送c語言結構體_C語言中結構體直接賦值?

在C語言中結構體變量之間可以進行賦值操作嗎&#xff1f;簡單結構體的賦值先說結論&#xff1a;一般來說&#xff0c;C語言中的結構體變量可以用另一個變量對其進行賦值或初始化。簡單結構體(不包含指針成員)直接賦值沒有問題。我們先下面一段代碼&#xff1a;#include #includ…

Cacti 使用安裝詳解-企業級實例

Cacti是一套基于PHP,MySQL,SNMP及RRDTool開發的網絡流量監測圖形分析工具。Cacti是通過 snmpget來獲取數據&#xff0c;使用 RRDtool繪畫圖形&#xff0c;它提供了非常強大的數據和用戶管理功能&#xff0c;可以指定每一個用戶能查看樹狀結構、host以及任何一張圖&#xff0c;還…

MySQL 插入數據時,中文亂碼???問題的解決

在終端&#xff0c;mysql -u root -p 登錄&#xff1b; show variables like character%; 來查看當前數據庫的相關編碼集。 client為客戶端使用的字符集。connection為連接數據庫的字符集設置類型&#xff0c;如果程序沒有指明連接數據庫使用的字符集類型則按照服務器端默認的字…

mysql時間間隔interval_MySQL DATEDIFF函數獲取兩個日期的時間間隔的方法

描述返回兩個日期之間的時間間隔。語法DateDiff(interval, date1, date2 [ ,firstdayofweek[ , firstweekofyear]] )DateDiff 函數的語法有以下參數&#xff1a;參數描述interval必選。字符串表達式&#xff0c;表示用于計算 date1 和 date2 之間的時間間隔。有關數值&#xff…