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,如需转载请自行联系原作者
目录
相关文章
|
存储 安全 网络协议
阿里云SSL数字证书原理、使用、申请流程及部署方式
本文带您了解阿里云数字证书的基本原理、使用、申请流程及部署方式
|
12月前
|
安全 数据安全/隐私保护
深入解析 https
在使用HTTP协议时,数据传输是明文形式,容易遭受运营商劫持等安全问题,如篡改返回网页内容、修改Referer字段等。为解决这些问题,引入了HTTPS协议,它通过加密、认证和完整性保护,确保通信内容不被第三方窃听或篡改。HTTPS结合了对称加密和非对称加密,使用公钥加密对称密钥,私钥解密,确保数据安全性和传输效率。然而,中间人攻击仍可能破解这一机制,因此引入证书机制,客户端通过验证证书中的数字签名来确认公钥的有效性,从而保障数据传输的安全性。
266 0
|
11月前
|
存储 NoSQL MongoDB
MongoDB 8.0现已全面可用
如何从MongoDB旧版本升级至8.0,可登录参考升级指南:https://www.mongodb.com/zh-cn/docs/manual/tutorial/upgrade-revision/
|
负载均衡 应用服务中间件 Linux
在Linux中,LVS、Nginx、HAproxy有什么区别?工作中怎么选择?
在Linux中,LVS、Nginx、HAproxy有什么区别?工作中怎么选择?
|
API 调度 Android开发
探索Android应用程序的后台运行机制
在移动应用开发中,了解和掌握Android应用程序的后台运行机制至关重要。本文将深入探讨Android平台上应用程序的后台运行原理及其影响因素,包括后台服务、广播接收器、JobScheduler等关键组件,以及如何有效管理后台任务以提升应用性能和用户体验。
1234 3
|
人工智能 Java 物联网
C# 成为 2023 年度编程语言之王!
2023 年 TIOBE 年度编程语言已经正式公布,C# 在稳居前 10 名 20 多年之久后,首次摘下年度编程语言桂冠。TIOBE 数据显示,C# 在 2023 年的涨幅达 1.43%,远超过竞争对手 Scratch 的 0.83% 和 Fortran 的 0.64%。
728 1
C# 成为 2023 年度编程语言之王!
|
SQL NoSQL 前端开发
MySQL 连接数过多的处理方法合集 - Too many connections - 卡拉云
碰到`Can not connect to MySQL server. Too many connections”-mysql`错误着实令人抓狂。这基本等于失去了对 MySQL 的控制权。本教程将详细讲解多种处理此错误的方法。 sudo mysql -uroot -p ERROR 1040 (00000): Too many connections
22889 1
|
SQL 数据库
SQL LIKE 运算符:用法、示例和通配符解释
SQL中的LIKE运算符用于在WHERE子句中搜索列中的指定模式。通常与LIKE运算符一起使用的有两个通配符: 百分号 % 代表零个、一个或多个字符。 下划线 _ 代表一个单个字符。 以下是LIKE运算符的用法和示例:
745 0
|
供应链 物联网 大数据
研究发布丨犀牛制造独领风骚的背后是工业互联网模式创新:C2M和1+N
阿里巴巴密谋3年之久,媲美淘宝天猫、蚂蚁金服、支付宝的又一重大项目出炉:犀牛制造,整合中国服装制造业,甚至整个制造业的宏大计划。对于万千淘宝商家背后海量制造工厂的数字化升级影响深远,按需定制,智慧工厂将触手可及。这背后体现出工业互联网平台的协同可持续发展,需要和消费者、企业、行业、地域的深入互动。 其中,C2M 模式和阿里巴巴摸索出的 “1+N”工业互联网模式,已经成为推动数字经济发展与制造业转型升级的利器。
研究发布丨犀牛制造独领风骚的背后是工业互联网模式创新:C2M和1+N
成功解决ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED L
成功解决ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED L