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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Understand Lambda Expressions in 3 minutes(翻译)相关推荐
- lambda expressions are not supported at this language level
IDEA下报错:lambda expressions are not supported at this language level 解决: 1. File -> Project Struct ...
- 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法
[104]Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法 ...
- Idea Lambda expressions are not supported at language level '5'
错误如下 IDEA运行时报错了,错误如下 Idea Lambda expressions are not supported at language level '5' 在网上查找一番,最终解决了. ...
- 解决IDEA报错:Lambda expressions not supported at language level '7'
这是因为项目选择的Java版本不是Java8,自然不支持Java8的Lambda 表达式 选择File → Project Structure → Project, 修改Level 到8 - Lamb ...
- 报错:[Warning] lambda expressions only available with -std=c++11 or -std=gnu++11
翻译: 某函数当前版本用不了, 必须改成C++11或 GNU++11 解决办法: 1. 先到Dev的官网中下载当前的最新版本(已经下载了C++11版本的可直接跳到第二步),这里已经替大家封装好安装包了 ...
- Lambda expressions are not supported at language level ‘5‘
File->Project Structure:
- Idea Lambda expressions are not supported at language level '5' 解决
在网上查找方法,大多都是设置项目SDK版本号和setting-->Build, Execution, Deployment-->Compiler--> Java Compiler 设 ...
- 拉姆达表达式(Lambda Expressions)
让我们先看一个简单的拉姆达表达式: x=>x/2 这个表达式的意思是:x为参数,对x进行相应的操作后的结果作为返回值. 通过这个拉姆达表达式,我们可以看到: 这个表达式没有任何类型信息,但这并不 ...
- Python中的Lambda表达式
Lambda表达式 (Lambda Expressions) Lambda Expressions are ideally used when we need to do something simp ...
最新文章
- 【云周刊】第178期:阿里云以生态联盟推动全球市场,牵手Bolloré集团全球合作...
- 从 25 倍稀释下的蘑菇街期权说起
- Android应用开发经常使用知识
- NTRIP/ SUPL
- 计算机位数与内存相关,弄懂电脑的各种位数、内存、存储
- C#基础--类/接口/成员修饰符,多态、重载、重写,静态和非静态
- python数值积分_python与计算物理:实现数值积分的Simpson方法
- python-面向对象编程设计与开发
- 前端学习(2182):keep-alive及其他问题
- C# 分割字符串方法
- 什么是Nacos?Nacos注册配置中心介绍
- asp.net的一些对话
- abb机器人searchl报错_西门子PLC1200与ABB机器人通信
- 白帽黑客眼中的网络安全 挡黑客财路曾收恐吓信
- 2018湘南学院计算机分数线,湘南学院录取分数线2021是多少分(附历年录取分数线)...
- 谷歌浏览器屏蔽广告插件
- windows关闭休眠
- JavasScript 第一天课 课后笔记 2022.3.21
- 群晖docker搭建halo个人博客
- 上海商报:超级表格创始人叫板Excel