關於函數式編程(Functional Programming)的學習筆記Ⅲ—Lambda運算式

來源:互聯網
上載者:User
0.要點

1.匿名函數與 lambda運算式

2.lambda運算式的書寫格式

3.lambda運算式樣本

 

1. 匿名函數與lambda運算式

         Lambda 運算式(拉姆達運算式) 和 匿名方法 其實是一件事情。唯一的不同是:他們文法表現形式不同。Lambda 運算式是在文法方面的更進一步的進化。在本質上,他們是一件事情。他們的作用都是:產生方法。即:內聯方法。

        引用自 C#首席架構師Anders Hejlsberg 的原話: lambda expressions and anonymous methods are really just two words for the same thing. The only thing that differs is, "What does the syntax look like?" And the lambda expressions are a further evolution of the syntax.But underneath, they do the same thing. They generate methods. You know, they're in-line methods.

         所以:我們要瞭解 Lambda 運算式 就應該同時也瞭解 匿名方法。

        下面先看一個簡單的代碼例子,分別用匿名方法和Lambda 運算式來實現對數組的搜尋:

匿名方法

    static void Main(string[] args)    {        string[] list = new string[] { "apple", "banana", "orange" };        string[] afruit = Array.FindAll<string>(list,             delegate(string s)            {                return s.IndexOf('a') >0;            });        foreach (string s in afruit)        {            Console.WriteLine(s);        }        Console.Read();    }

 

Lambda運算式

    static void Main(string[] args)    {        string[] list = new string[] { "apple", "banana", "orange" };        string[] afruit = Array.FindAll<string>(list, (s=>s.IndexOf('a')>0));        foreach (string s in afruit)        {            Console.WriteLine(s);        }        Console.Read();    }

從上面的例子中,我們可以看出:

從代碼書寫角度,代碼可讀性角度來說:Lambda運算式 比匿名方法更簡單了。

而 Lambda運算式 和 匿名方法都是乾的同一件事情,讓我們少寫一個函數定義。函數的調用和函數的實現在一起完成了。

 

2.lambda運算式的書寫格式
    (int x) => x 1 // 顯式型別參數     (y,z) => return y * z; // 隱式型別參數

      (參數列表) => 運算式或者語句塊

       其中:

      參數個數:可以有多個參數,一個參數,或者無參數。

      參數類型:可以隱式或者顯式定義。

      運算式或者語句塊:這部分就是我們平常寫函數的實現部分(函數體)。

     匿名函數和lambda運算式都是函數式編程思想下的產物,函數式編程如果從定義上來理解是比較晦澀的,但是簡單的來說:函數式編程的主要特點就是沒有變數,所有演算法都用遞迴函式來編寫。整個程式除了定義函數就是調用函數,沒有其他類型的語句。

 

 

3.lambda運算式樣本

       從上面的例子中我們已經看到,lambda運算式能減少不少代碼。不過,最節省代碼的地方更應該是其“分組”和“字典轉化”等功能,下面我們來看看下面的例子

索引樣本

      大家都知道一般在英文書的後面都會有索引(Index)這個東西,它其實就是“列出所有的關鍵字,根據其首字母進行分組,並且要求對每組內部的關鍵字進行排序”。簡單說來,我們需要的其實是這麼一個方法:

        static Dictionary< char, List< string>> GetIndex(IEnumerable< string> keywords) { /*...*/ } 
    下面是具體的代碼
        static Dictionary<char, List<string>> GetIndex(IEnumerable<string> keywords)         {            //定義字典            var result = new Dictionary<char, List<string>>();            //填充字典            foreach (var kw in keywords)            {                 var firstword=kw[0];                List<string> groupKeywords;                if (!result.TryGetValue(firstword, out groupKeywords))                {                    groupKeywords = new List<string>();                    result.Add(firstword, groupKeywords);                }                groupKeywords.Add(kw);            }            foreach(var groupKeywords in result.Values)            {                groupKeywords.Sort();            }            return result;        }

        如果使用Lambda運算式及.net架構中定義的擴充方法,代碼就減少了很多

        static Dictionary<char, List<string>> GetIndex(IEnumerable<string> keywords)         {            return keywords                .GroupBy(k=>k[0])   //按照首字母分組                .ToDictionary(          //構造字典                    g=>g.Key,           //以每組的KEY作為鍵                    g=>g.OrderBy(k=>k).ToList());   //對每組排列產生列表        }

 

         因為有了Lambda運算式,.NET中的一些函數式編程特性才被真正推廣開來,為了深入瞭解lambda運算式及函數式編程,下節我將進入F#的學習。

        

 

 

參考資料:

http://decijam.spaces.live.com/Blog/cns!DE71A258DA9B4603!308.entry?wa=wsignin1.0&sa=864998688

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.