本文翻译自CodeProject上的一篇简单解释Lambda表达式的文章,适合新手理解。译文后面我补充了一点对Lambda表达式的说明。html
1.什么是Lambda表达式?ajax
Lambda表达式是一种匿名方法,多数状况下用来在LINQ中快速建立委托。简单地说,它表明一个没有被定义过的方法,好比没有访问修饰符、没有返回值声明也没有方法名称。编程
2.咱们为何须要Lambda表达式?(为何咱们须要定义一个没有方法名的方法?)json
为了更方便。Lambda表达式容许你在调用方法的地方去定义该方法的实现。当一个方法很是简短,而且它只会被使用到过一次时,使用Lambda表达式很是节省时间,由于这时候咱们能够不用单独地去定义这个方法。app
优势:函数式编程
Lambda表达式应该是短小的,不该该是复杂的代码,不然代码看起来比较乱,不易读懂。函数
3.怎样定义一个Lambda表达式?url
Lambda表达式基本定义:参数列表 => 执行代码。(如 (a,b) => {return a+b;},译者注)spa
简单例子翻译
你能够将以上代码理解为:输入一个名为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。它们就是这种关系。