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.mzph.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…