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.在方法调用处定义方法的实现
int a = ;
int b = ;
int c = ((Func<int, int, int>)((arg1, arg2) => { return arg1 + arg2; }))(a, b); //现场定义现场调用
Console.WriteLine("c is " + c);
Console.Read();
如上代码中,我们并没有单独定义一个方法来计算两个整数的和,而是在需要用到的时候现场使用Lambda表达式去定义。
注:(arg1,arg2)=>{rerurn arg1+arg2;}与(arg1,arg2)=>arg1+arg2的效果是一样的,前者更为通用,当表达式中有多行代码时,必须使用花括号。
2.将代码块以参数的形式进行传递
使用Lambda表达式时,我们可以快速创建委托,进而将创建的委托作为参数进行传递。
List<int> list1 = new List<int>{,,};
List<int> list2 = list1.where(n=>n%==).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。它们就是这种关系。

Understand Lambda Expressions in 3 minutes(翻译)的更多相关文章
- C# Lambda Expressions 简介
C# Lambda Expressions 简介 原文http://msdn2.microsoft.com/en-us/library/bb397687.aspx 翻译:朱之光 (larry1zhu@ ...
- Lambda Expressions and Functional Interfaces: Tips and Best Practices
转载自https://www.baeldung.com/java-8-lambda-expressions-tips 1. Overview Now that Java 8 has reached ...
- jdk8新特性之lambda expressions
本文分两部分: 语法简单说明 lambda的使用 注:这两部分内容均以类+注释的方式进行说明,并且内容均来自官方教程(https://docs.oracle.com/javase/tutorial/j ...
- java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)
2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...
- 1.8 新特性之 Lambda Expressions
Lambda expressions are allowed only at source level 1.8 or above The target type of this expression ...
- lambda expressions are not supported at this language level
IDEA下报错:lambda expressions are not supported at this language level 解决: 1. File -> Project Struct ...
- ef中用lambda expressions时要注意(m=>m.id ==b ) 此时的b只能是基本的数据类型 。连属性都不能用
ef中用lambda expressions时要注意(m=>m.id ==b ) 此时的b只能是基本的数据类型 .连属性都不能用
- Hacking Lambda Expressions in Java
Hacking Lambda Expressions in Javahttps://dzone.com/articles/hacking-lambda-expressions-in-java At t ...
- 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法
错误重现 我的机器上安装了 maven 3.5.0,在 eclipse 中创建 maven 项目.pom.xml配置如下: <project xmlns="http://maven.a ...
随机推荐
- SQL Server 事务以及事务日志综述
事务是一个非常重要的概念,特此在这里写一些文章来总结.整篇文章还在持续更新中. 在本系列文章中,你将看到以下内容: 数据库事务(Database Transaction)概述 事务操作(BEGIN/C ...
- Windows下用tree命令生成目录树
有时候我们想为某个目录制作一个文档结构图,在Windows上,我们知道是使用tree命令. 但是,默认情况下tree只显示子目录名,而不显示子目录里的文件名,需要加上/F参数才能显示完整的文件名. ...
- JS根据经纬度获取地址信息
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- win7(x64)下安装cocos2d并编译安卓项目
好吧,不为啥,就是如题. win7 x64 脑袋内存比较小,说不定明儿就忘了,今天记录一下. 没有什么经验,所有步骤基本都是百度出来的,这里边操作边记录,为了保护原创作者,这里我都附上我查找的链接. ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
- dir命令只显示文件名
dir /b 就是ls -f的效果 1057 -- FILE MAPPING_web_archive.7z 2007 多校模拟 - Google Search_web_archive.7z 2083 ...
- Unity引擎IOS执行档大小优化
简介 苹果对于IOS执行档的大小是有明确的限制的,其中TEXT段的大小不能超过80M,否则提审将会被苹果拒绝,同时,如果TEXT段过于太大,那么在苹果进行加密之后,很容易出现解压失败等各种异常,最终导 ...
- Beginning Scala study note(8) Scala Type System
1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the h ...
- MIT 6.828 JOS学习笔记12 Exercise 1.9
Lab 1中Exercise 9的解答报告 Exercise 1.9: 判断一下操作系统内核是从哪条指令开始初始化它的堆栈空间的,以及这个堆栈坐落在内存的哪个地方?内核是如何给它的堆栈保留一块内存空间 ...
- 转:学习笔记:delphi多线程学识
学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处 ...