本文翻译自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,如需转载请自行联系原作者

Understand Lambda Expressions in 3 minutes(翻译)相关推荐

  1. lambda expressions are not supported at this language level

    IDEA下报错:lambda expressions are not supported at this language level 解决: 1. File -> Project Struct ...

  2. 【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错误的解决方法 ...

  3. Idea Lambda expressions are not supported at language level '5'

    错误如下 IDEA运行时报错了,错误如下 Idea Lambda expressions are not supported at language level '5'  在网上查找一番,最终解决了. ...

  4. 解决IDEA报错:Lambda expressions not supported at language level '7'

    这是因为项目选择的Java版本不是Java8,自然不支持Java8的Lambda 表达式 选择File → Project Structure → Project, 修改Level 到8 - Lamb ...

  5. 报错:[Warning] lambda expressions only available with -std=c++11 or -std=gnu++11

    翻译: 某函数当前版本用不了, 必须改成C++11或 GNU++11 解决办法: 1. 先到Dev的官网中下载当前的最新版本(已经下载了C++11版本的可直接跳到第二步),这里已经替大家封装好安装包了 ...

  6. Lambda expressions are not supported at language level ‘5‘

    File->Project Structure:

  7. Idea Lambda expressions are not supported at language level '5' 解决

    在网上查找方法,大多都是设置项目SDK版本号和setting-->Build, Execution, Deployment-->Compiler--> Java Compiler 设 ...

  8. 拉姆达表达式(Lambda Expressions)

    让我们先看一个简单的拉姆达表达式: x=>x/2 这个表达式的意思是:x为参数,对x进行相应的操作后的结果作为返回值. 通过这个拉姆达表达式,我们可以看到: 这个表达式没有任何类型信息,但这并不 ...

  9. Python中的Lambda表达式

    Lambda表达式 (Lambda Expressions) Lambda Expressions are ideally used when we need to do something simp ...

最新文章

  1. 【云周刊】第178期:阿里云以生态联盟推动全球市场,牵手Bolloré集团全球合作...
  2. 从 25 倍稀释下的蘑菇街期权说起
  3. Android应用开发经常使用知识
  4. NTRIP/ SUPL
  5. 计算机位数与内存相关,弄懂电脑的各种位数、内存、存储
  6. C#基础--类/接口/成员修饰符,多态、重载、重写,静态和非静态
  7. python数值积分_python与计算物理:实现数值积分的Simpson方法
  8. python-面向对象编程设计与开发
  9. 前端学习(2182):keep-alive及其他问题
  10. C# 分割字符串方法
  11. 什么是Nacos?Nacos注册配置中心介绍
  12. asp.net的一些对话
  13. abb机器人searchl报错_西门子PLC1200与ABB机器人通信
  14. 白帽黑客眼中的网络安全 挡黑客财路曾收恐吓信
  15. 2018湘南学院计算机分数线,湘南学院录取分数线2021是多少分(附历年录取分数线)...
  16. 谷歌浏览器屏蔽广告插件
  17. windows关闭休眠
  18. JavasScript 第一天课 课后笔记 2022.3.21
  19. 群晖docker搭建halo个人博客
  20. 上海商报:超级表格创始人叫板Excel

热门文章

  1. 《Head First设计模式》第三章笔记 装饰者模式
  2. C++:22 再议const的作用(上)
  3. 无限踩坑系列(8)--猿界神猿
  4. Ubuntu环境使用conda安装轻量级中文ocr开源项目chineseocr_lite,最简单的方式
  5. 面试中如何剔除“鱼目混珠”程序员?
  6. 为什么有些语言会比别的快?
  7. 不是所有人都懂这样做,你若做了就能高升!
  8. 对Docker常用命令的整理
  9. 关于[super dealloc]
  10. 虚拟环境vitualenv的使用