自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET Lambda表達(dá)式的函數(shù)式特性:索引示例

開(kāi)發(fā) 后端
本文提供了一個(gè).NET Lambda表達(dá)式的示例:實(shí)現(xiàn)一個(gè)索引功能。這個(gè)示例體現(xiàn)出了Lambda表達(dá)式的簡(jiǎn)潔性與函數(shù)式+聲明式所帶來(lái)的好處。

.NET Lambda表達(dá)式最節(jié)省的部分

使用Lambda表達(dá)式還可以節(jié)省許多代碼(相信您從第一個(gè)示例中也可以看出來(lái)了)。不過(guò)我認(rèn)為,最省代碼的部分更應(yīng)該可能是其“分組”和“字典轉(zhuǎn)化”等功能。因此,我們來(lái)看下一個(gè)示例。

這個(gè)示例可能更加貼近現(xiàn)實(shí)。不知您是否關(guān)注過(guò)某些書籍后面的“索引”,它其實(shí)就是“列出所有的關(guān)鍵字,根據(jù)其首字母進(jìn)行分組,并且要求對(duì)每組內(nèi)部的關(guān)鍵字進(jìn)行排序”。簡(jiǎn)單說(shuō)來(lái),我們需要的其實(shí)是這么一個(gè)方法:

  1. static Dictionary< char, List< string>> GetIndex(IEnumerable< string> keywords) { ... }  

想想看,您會(huì)怎么做?其實(shí)不難(作為示例,我們這里只關(guān)注小寫英文,也不關(guān)心重復(fù)關(guān)鍵字這種特殊情況):

  1. static Dictionary< char, List< string>> GetIndex(IEnumerable< string> keywords)  
  2. {  
  3.     // 定義字典  
  4.     var result = new Dictionary< char, List< string>>();  
  5.  
  6.     // 填充字典  
  7.     foreach (var kw in keywords)  
  8.     {  
  9.         var firstChar = kw[0];  
  10.         List< string> groupKeywords;  
  11.  
  12.         if (!result.TryGetValue(firstChar, out groupKeywords))  
  13.         {  
  14.             groupKeywords = new List< string>();  
  15.             result.Add(firstChar, groupKeywords);  
  16.         }  
  17.  
  18.         groupKeywords.Add(kw);  
  19.     }  
  20.  
  21.     // 為每個(gè)分組排序  
  22.     foreach (var groupKeywords in result.Values)  
  23.     {  
  24.         groupKeywords.Sort();  
  25.     }  
  26.  
  27.     return result;  
  28. }  
  29.  

那么如果利用Lambda表達(dá)式及.NET框架中定義的擴(kuò)展方法,代碼又會(huì)變成什么樣呢?請(qǐng)看:

  1. static Dictionary< char, List< string>> GetIndexByLambda(IEnumerable< string> keywords)  
  2. {  
  3.     return keywords  
  4.         .GroupBy(k => k[0]) // 按照首字母分組  
  5.         .ToDictionary( // 構(gòu)造字典  
  6.             g => g.Key, // 以每組的Key作為鍵  
  7.             g => g.OrderBy(k => k).ToList()); // 對(duì)每組排序并生成列表  
  8. }  

光從代碼數(shù)量上來(lái)看,前者便是后者的好幾倍。而有關(guān)“聲明式”,“what”等可讀性方面的優(yōu)勢(shì)就不再重復(fù)了,個(gè)人認(rèn)為它比上一個(gè)例子給人的“震撼”有過(guò)之而無(wú)不及。

試想,如果我們把GetIndexByLambda方法中的Lambda表達(dá)式改成.NET 2.0中delegate形式的寫法:

  1. static Dictionary< char, List< string>> GetIndexByDelegate(IEnumerable< string> keywords)  
  2. {  
  3.     return keywords  
  4.         .GroupBy(delegate(string k) { return k[0]; })  
  5.         .ToDictionary(  
  6.             delegate(IGrouping< charstring> g) { return g.Key; },  
  7.             delegate(IGrouping< charstring> g)  
  8.             {  
  9.                 return g.OrderBy(delegate(string s) { return s; }).ToList();  
  10.             });  
  11. }  

您愿意編寫這樣的代碼嗎?

.NET Lambda表達(dá)式體現(xiàn)了函數(shù)式編程特性

因此,Lambda表達(dá)式在這里還是起著決定性的作用。事實(shí)上正是因?yàn)橛辛薒ambda表達(dá)式,.NET中的一些函數(shù)式編程特性才被真正推廣開(kāi)來(lái)?!罢Z(yǔ)言特性”決定“編程方式”的確非常有道理。這一點(diǎn)上Java是一個(gè)很好的反例:從理論上說(shuō),Java也有“內(nèi)聯(lián)”的寫法,但是C#的使用快感在Java那邊還只能是個(gè)夢(mèng)。試想GetIndexByLambda在Java中會(huì)是什么情況3:

  1. public Dictionary< Char, List< String>> GetIndexInJava(Enumerable< String> keywords)  
  2. {  
  3.     return keywords  
  4.         .GroupBy(  
  5.             new Func< String, Char> {  
  6.                 public Char execute(String s) { return s.charAt(0); }  
  7.             })  
  8.         .ToDictionary(  
  9.             new Func< Grouping< Char, String>, Char> {  
  10.                 public Char execute(IGrouping< Char, String> g) { return g.getKey(); }  
  11.             },  
  12.             new Func< Grouping< Char, String>, List< string>> {  
  13.                 public List< String> execute(IGrouping< Char, String> g)  
  14.                 {  
  15.                     return g  
  16.                         .OrderBy(  
  17.                             new Func< String, String> {  
  18.                                 public String execute(String s) { return s; }  
  19.                             })  
  20.                         .ToList();  
  21.                 }  
  22.             });  
  23. }  

一股語(yǔ)法噪音的氣息撲面而來(lái),讓人無(wú)法抵擋。由于Java中的匿名類型語(yǔ)法(即上面這種內(nèi)聯(lián)寫法)連類型信息(new Func< String, Char>{ ... }這樣的代碼)都無(wú)法省去,因此給人非常繁瑣的感覺(jué)。面對(duì)這樣的代碼,您可能會(huì)有和我一樣的想法:“還不如最普通的寫法氨。沒(méi)錯(cuò),這種函數(shù)式編程的風(fēng)格,由于缺乏語(yǔ)言特性支持,實(shí)在不適合在Java語(yǔ)言中使用。事實(shí)上,這種內(nèi)聯(lián)寫法很早就出現(xiàn)了(至少在02、03年我還在使用Java的時(shí)候就已經(jīng)有了),但是那么多年下來(lái)一點(diǎn)改進(jìn)都沒(méi)有。而Lambda表達(dá)式出現(xiàn)之后,社區(qū)中立即跟進(jìn)了大量項(xiàng)目,如Moq,F(xiàn)luent NHibernate等等,充分運(yùn)用了C# 3.0的這一新特性。難道這還不夠說(shuō)明問(wèn)題嗎?

對(duì)了,再次推薦一下Scala語(yǔ)言,它的代碼可以寫的和C#一樣漂亮。我不是Java平臺(tái)的粉絲,更是Java語(yǔ)言的忠實(shí)反對(duì)者,但是我對(duì)Java平臺(tái)上的Scala語(yǔ)言和開(kāi)源項(xiàng)目都抱有強(qiáng)烈的好感。

既然談到了函數(shù)式編程,那么就順便再多說(shuō)幾句。其實(shí)這兩個(gè)例子都有濃厚的函數(shù)式編程影子在里面,例如,對(duì)于函數(shù)試編程來(lái)說(shuō),Where常被叫做filter,Select常被叫做map。而.NET 3.5中定義的另一些方法在函數(shù)式編程里都有體現(xiàn)(如Aggregate相當(dāng)于fold)。如果您對(duì)這方面感興趣,可以關(guān)注Matthew Poswysocki提出的Functional C#類庫(kù)。

以上就介紹了.NET Lambda表達(dá)式的另一個(gè)范例。

【編輯推薦】

  1. .NET Lambda表達(dá)式的語(yǔ)義:字符串列表范例
  2. 使用.NET 3.5 Lambda表達(dá)式實(shí)現(xiàn)委托
  3. 各版本.NET委托的寫法回顧
  4. C# Actor模型開(kāi)發(fā)實(shí)例:網(wǎng)絡(luò)爬蟲
  5. 強(qiáng)類型和Actor:ActorLite的演示
責(zé)任編輯:yangsai 來(lái)源: 老趙點(diǎn)滴
相關(guān)推薦

2009-08-10 09:41:07

.NET Lambda

2021-05-05 11:31:15

JDK新特性Lambda表達(dá)式Java8

2020-10-16 06:40:25

C++匿名函數(shù)

2009-08-31 17:11:37

Lambda表達(dá)式

2010-01-05 14:45:58

.NET Framew

2009-08-10 17:11:34

.NET 3.5擴(kuò)展方Lambda表達(dá)式

2024-12-02 10:56:29

2024-03-08 09:45:21

Lambda表達(dá)式Stream

2015-08-04 09:16:20

JavaLambda表達(dá)式

2021-08-31 07:19:41

Lambda表達(dá)式C#

2012-06-26 10:03:58

JavaJava 8lambda

2009-09-11 09:48:27

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-15 15:18:00

Linq Lambda

2022-12-05 09:31:51

接口lambda表達(dá)式

2022-12-01 07:38:49

lambda表達(dá)式函數(shù)式

2024-03-25 13:46:12

C#Lambda編程

2009-10-12 10:11:08

Lambda表達(dá)式編寫

2009-08-10 09:54:19

.NET Lambda

2023-12-28 08:00:40

lambda表達(dá)式Java 8
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)