浅入浅出Lambda表达式
大家在开发中会经常看到也会经常使用lambda表达式。
园子里也有很多详解lambda表达式的文章,多是从横向来讲述。
但lambda表达式到底如何变成现在这个样子,表达式的形式到底代表什么含义,这些可能就不太明白了。
本文将从来源开始,纵向剖析,一直演化出我们常用的lambda表达式。
引子
为方便说明,先举个例子,列出Lambda表达式的一个典型形式:
x=>x+1
大家可以看到,Lambda表达式的语法由三部分组成,分别为:
1. Lambda运算符 => 读作goes to;
2. 左边参数部分 x ;
3. 右边的Lambda主体
可以看出,其实所谓的Lambda表达式(lambda expression)就是一个匿名函数,或者说是匿名函数的简单形式。而匿名函数的作用就是分配给委托类型的。
假设我们声明一个委托:
delegate int Mydel(int x);
lambada 表达式(匿名函数)用来填充委托变量:
Mydel del= x=>x+1;
我们就从这个例子说开去。
演化过程
刚刚说过,lambda表达式就是匿名方法的简写形式,说到lambda表达式就要说到匿名方法,而匿名方法就是初始化委托时内联声明的方法。
因此我们先从委托说起,一直推导出 lambda表达式Mydel del=x=>x+1; 的形式。
和类相似,委托是用户自定义的引用类型。
类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。
可以将委托类比为类,创建和使用的过程如下:
1.声明类型
2.声明类型的变量
3.填充变量
4.使用变量
对应着四步的完整例子:
delegate int Mydel(int x);
Mydel del;
del=new Mydel(xxx方法); //也可以直接用简化写法 del=xxx方法;
del(2);
以上第三步中初始化委托使用 xxx方法 。
如果方法专门用来初始化委托,只会被使用一次,这种情况下,除了创建委托的语法需要,没有必要创建独立的具名方法,这样就引出了匿名方法。
匿名方法是在初始化委托时内联声明的方法,非匿名方法的例子如下:
public static int Add1(int x)
{
return x+1 ;
}
delegate int MyDel(int x);
调用:
MyDel del=Add1;
del(2);
改造成用匿名方法的完整例子:
delegte int MyDel(int x);
调用:
MyDel del=delegate(int x) { return x+1;}
del(2);
从例子中提取出匿名方法的语法:
delegate(Parameters) { ImplementationCode }
几个注意点:
1. 返回值:不显示声明返回值,与委托相同
2. 参数
以下情况可以使用圆括号为空或省略圆括号来简化参数列表。
a. 不包括任何out 参数 b. 不使用任何参数
满足上面两个条件即可省略参数列表,例子:
delegate int SomeDel();
SomeDel sDel = delegate { return 1; };
3.params 参数
如果委托声明的参数列表包含了 params 参数(可变数目参数),匿名方法的参数列表将忽略params关键字
delegate void SomeDel(int x, params int[] y);
SomeDel sDel = delegate(int x, int[] y) { … }
匿名方法准备好了,我们稍加变化,就可以得出Lambda表达式
以 MyDel del=delegate(int x) { return x+1;} 为例。
转换步骤:
1.删除delegate关键字,在参数列表和匿名方法主体之间放 =>
MyDel del = (int x) => {return x+1; } ;
可以进一步简化
2. 去掉参数类型
MyDel del2 = (x) => {return x+1; } ;
说明:
编译器可以从委托声明中知道委托参数的类型,因此可以省略类型。
带有类型的参数列表称为显式类型。
省略类型的参数列表称为隐式类型。
3.去掉参数刮号
MyDel del3 = x => {return x+1; } ;
说明:
如果只有一个隐式类型参数,可以省略刮号。
4.去掉主体的大刮号及return
MyDel del4 = x=> x+1;
说明:
Lambda表达式允许表达式的主体是语句块或表达式。
如果语句块包含一个返回语句,可以将语句块替换成return 后面的表达式。
这样就得到我们文章开头的形式。
总结
C#2.0引入了匿名方法,C#3.0引入了lambda表达式,可以看到,lambda表达式简化了匿名函数的使用,让代码更加简洁。
理解了这篇文章,相信大家对lambda表达式就会有一个整体的把握,再学具体用法时思路会很清晰。
祝学习进步~
浅入浅出Lambda表达式的更多相关文章
- 浅入浅出EmguCv(三)EmguCv打开指定视频
打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图 ...
- 浅入浅出EmguCv(一)OpenCv与EmguCv
最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领 ...
- 浅入深出之Java集合框架(上)
Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- 浅入深出之Java集合框架(中)
Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- 浅入深出之Java集合框架(下)
Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...
- 浅入深出Vue:环境搭建
浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...
- 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置
浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...
- 浅入深出Vue:工具准备之WebStorm安装配置
浅入深出Vue之工具准备(一):WebStorm安装配置 工欲善其事必先利其器,让我们先做好准备工作吧 导航篇 WebStorm安装配置 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版 ...
- 浅入深出Vue系列
浅入深出Vue导航 导航帖,直接点击标题即可. 文中所有涉及到的资源链接均在最下方列举出来了. 前言 基础篇 浅入深出Vue:工具准备之WebStorm搭建及配置 浅入深出Vue之工具准备(二):Po ...
- 浅入深出Vue:前言
浅入深出Vue系列文章 之前大部分是在做后端,后来出于某些原因开始接触Vue.深感前端变化之大,各种工具.框架令人眼花缭乱.不过正是这些变化,让前端开发更灵活. 博主在刚开始时,参考官网的各个步骤以及 ...
随机推荐
- 汇编 AND 运算
AND运算 逻辑与&& 按位与& 一.AND运算 1&&12=1; 12&&0=0; 0&&1=0; 0040100 ...
- 3.RapidIO串行物理层的包传输过程
转自https://www.cnblogs.com/liujinggang/p/10005431.html 一.引言 前几篇文章已经谈到RapidIO的协议,串行物理层与控制符号. RapidIO协议 ...
- JAVA 静态方法和实例方法的区别 (图表)
静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这 ...
- phabricator 结合 arcanist 使用
简介 arcanist 是 phabricator 接口的命令工具,主要用于提交 diff 和 push review 通过的commit. 安装 下载源码,然后指定系统的环境变量即可 $ some_ ...
- 公钥与私钥的理解,以及https的应用原理
1.公钥与私钥原理1)鲍勃有两把钥匙,一把是公钥,另一把是私钥2)鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把.3)苏珊要给鲍勃写一封保密的信.她写完后用鲍勃的公钥加密,就可以达到 ...
- 20135202闫佳歆--week5 课本18章学习笔记
第十八章 调试 内核级开发的调试工作远比用户级开发艰难的多. 一.准备开始 准备工作需要的是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 在这一章里,调试的主要思想是让bug重现 ...
- 20135220谈愈敏Linux Book_1&2
第一章 Linux内核简介 从unix的历史视角来认识Linux内核与Linux操作系统的前世今生. Unix历史 贝尔实验室设计的一个文件系统原型逐渐演化而成Unix,而后Unix操作系统用C语言重 ...
- 20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)
Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...
- 团队作业四-WBS练习
我们团队开发的是四则运算,主要面对的用户是小学生.老师及学生家长.经过我们组成员的讨论和结合实际及自身能力,对团队成员分配任务,队长负责全局工作主要负责任务,统一进度,和适量的编码,露哥和阮磊主要负责 ...
- ElasticSearch 2 (24) - 语言处理系列之停用词:性能与精度
ElasticSearch 2 (24) - 语言处理系列之停用词:性能与精度 摘要 在信息检索早期,磁盘和内存相较我们今天的使用只是很小的一部分.将索引空间保持在一个较小的水平是至关重要的,节省每个 ...