本文翻译自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.在方法调用处定义方法的实现

 int a = ;
int b = ;
int c = ((Func<int, int, int>)((arg1, arg2) => { return arg1 + arg2; }))(a, b); //现场定义现场调用
Console.WriteLine("c is " + c);
Console.Read();

如上代码中,我们并没有单独定义一个方法来计算两个整数的和,而是在需要用到的时候现场使用Lambda表达式去定义。

注:(arg1,arg2)=>{rerurn arg1+arg2;}与(arg1,arg2)=>arg1+arg2的效果是一样的,前者更为通用,当表达式中有多行代码时,必须使用花括号。

2.将代码块以参数的形式进行传递

使用Lambda表达式时,我们可以快速创建委托,进而将创建的委托作为参数进行传递。

List<int> list1 = new List<int>{,,};
List<int> list2 = list1.where(n=>n%==).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。它们就是这种关系。

Understand Lambda Expressions in 3 minutes(翻译)的更多相关文章

  1. C# Lambda Expressions 简介

    C# Lambda Expressions 简介 原文http://msdn2.microsoft.com/en-us/library/bb397687.aspx 翻译:朱之光 (larry1zhu@ ...

  2. Lambda Expressions and Functional Interfaces: Tips and Best Practices

    转载自https://www.baeldung.com/java-8-lambda-expressions-tips 1. Overview   Now that Java 8 has reached ...

  3. jdk8新特性之lambda expressions

    本文分两部分: 语法简单说明 lambda的使用 注:这两部分内容均以类+注释的方式进行说明,并且内容均来自官方教程(https://docs.oracle.com/javase/tutorial/j ...

  4. java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)

    2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...

  5. 1.8 新特性之 Lambda Expressions

    Lambda expressions are allowed only at source level 1.8 or above The target type of this expression ...

  6. lambda expressions are not supported at this language level

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

  7. ef中用lambda expressions时要注意(m=>m.id ==b ) 此时的b只能是基本的数据类型 。连属性都不能用

    ef中用lambda expressions时要注意(m=>m.id ==b ) 此时的b只能是基本的数据类型 .连属性都不能用

  8. Hacking Lambda Expressions in Java

    Hacking Lambda Expressions in Javahttps://dzone.com/articles/hacking-lambda-expressions-in-java At t ...

  9. 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法

    错误重现 我的机器上安装了 maven 3.5.0,在 eclipse 中创建 maven 项目.pom.xml配置如下: <project xmlns="http://maven.a ...

随机推荐

  1. Winform MDI窗体容器、权限、简单通讯

    MDI窗体容器: 一般来说,窗体是顶级容器,不允许放在其他任何容器内,但是如果将某个窗体的IsMdiContainer属性设置为True,那此窗体就会成为窗体容器,可以在其中放入其他窗体 在内部的窗体 ...

  2. html学习第三天—— 第12章——css布局模型

    清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上,又不同于我们常说的 ...

  3. 丢掉慢吞吞的AVD吧,android模拟神器:Genymotion

    安装图文介绍: http://padhz.com/how-to-run-android-simulator-on-pc.html; 刚好手头上有visual box,亲自试用了一下.新建了一个Gala ...

  4. [转]Windows7文件夹转移清理臃肿的C盘

    当你使用Windows的时候,你会发现无论哪个版本的Windows,系统都会默认将用户文件夹和程序数据文件夹(xp下是Documents and Settings文件夹,而windows7和vista ...

  5. 分布式大数据高并发的web开发框架

    一.引言 通常我们认为静态网页html的网站速度是最快的,但是自从有了动态网页之后,很多交互数据都从数据库查询而来,数据也是经常变化的,除了一些新闻资讯类的网站,使用html静态化来提高访问速度是不太 ...

  6. Codeforces 624

    B. Making a String time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  7. The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder is not applicable for the arguments

    The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder i ...

  8. JS操作Json

    因为我水啊 所以我就要手打一下 熟悉一下 ===== JSON 全称 JavaScript Object Notation(标记) 一种轻量级的数据交互格式,采用完全独立于语言的文本格式 同事JSON ...

  9. Docker学习笔记第一章:补充

    只记得学习后面的命令,忘记整理一些概念性的东西了,只能做个补充了=.= Docker虽然也是一种虚拟技术,但是不同于虚拟机的概念.Docker是一种以容器为主的技术,容器运行不需要模拟层(emulat ...

  10. Windows下使用doxygen阅读和分析C/C++代码

    Windows下使用doxygen阅读和分析C/C++代码 转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Sou ...