代码之美~Lambda带给我们的不只是简洁

.net进行3.5时代后,各种新的语言特性相继而来,今天主要说的是Lambda表达式带给我们的是什么?

说lambda肯定离不开匿名方法,说匿名方法肯定离不开委托,其实,你可以把这三个东西看作是一个事物的不同发展阶段,他们也标志着.net framework的发展史:

.net frameworks 1.x  委托

.net frameworks 2.x  匿名方法来实现委托

.net frameworks 3.x  lambda表达式来实现委托

委托,delegate你不要简单的说,“把方法当方法的参数传递给一个方法”,说实话,过去很长一段时间我也是局限在这个概念上的,但真的静下来想想,可能并非这样,委托做为一种思想出现在了.net世界里,从1.x就开始了它的征途,到2.x委托的实例创建上有了质的突破,可能体现在写法简洁上(匿名方法),到了3.x配合lambda表达式,使人们渐渐把委托给忘记了,其实在lambda表达式里,你关心的可能不在是委托,而是一个业务的语义问题,即它更加人性化了。如select选择,where条件,orderby排序等。

下面再带大家看一个1.x到3.x委托实例的演化

.net 1.x时代

 1         /// <summary>
 2         /// 输出字符串,返回为整数
 3         /// </summary>
 4         /// <param name="str"></param>
 5         /// <returns></returns>
 6         public delegate int Count(string str);
 7         /// <summary>
 8         /// 求字符长度的方法
 9         /// </summary>
10         /// <param name="str"></param>
11         /// <returns></returns>
12         public static int StrLength(string str) { return str.Length; }

调用时,需要实例化委托

1    Count a = new Count(StrLength);
2    a("abc");

.net 2.x时代,出现了匿名方法,它省略了实名方法的创建

1           Count anonymous = delegate(string str2)
2             {
3                 return str2.Length;
4             };
5             Console.WriteLine(anonymous("123"));

使用匿名方法,确实优化了不少,但好像还是少了点什么,感觉有点别扭,可以是delegate关键惹的祸吧
,在进入.net3.5 时代后,引入了lambda表达式,看看这种很炫的技术吧

1           Count lambda = i =>
2             {
3                 return i.Length;
4             };

代码又精简了,去掉了delegate关键字,实现上这种写法还不是正规的表达式写法,代码可以代进行精减

1    Count lambda2 = i => i.Length;

恩,这回应该是我们所需要的了,事实上,lambda表达式的这种特性叫“类型推演”,它可以推断出你的类型是什么,这个特性被广泛的应用在了LINQ上。

而向我之前介绍过的Func也是微软为我们封装好的委托,用lambda来实现它,很巧妙

Func<int, int> chengfang = (int cheng) => cheng * cheng;

当然,在lambda表达式美丽的背后,也有一些缺点:如性能有所降低,当然我是我们可以接受的

本文转自博客园张占岭(仓储大叔)的博客,原文链接:代码之美~Lambda带给我们的不只是简洁,如需转载请自行联系原博主。

时间: 2024-09-18 00:37:31

代码之美~Lambda带给我们的不只是简洁的相关文章

谁能告诉我用C#编程打开文件的代码啊,最好带汉语注释,谢谢大家了

问题描述 谁能告诉我用C#编程打开文件的代码啊,最好带汉语注释,谢谢大家了 解决方案 解决方案二:打开什么格式的文件啊解决方案三:File.Open(filepath...);解决方案四:File,FileStream,Process都会不同的形式打开,你要干嘛解决方案五:该回复于2012-04-10 16:16:27被版主删除解决方案六://OpenFileDialogOpenFileDialogofd=newOpenFileDialog();try{//要打开的文件种类(自己设定,这里举例x

代码之美~Func让构造方法为属性赋值更灵活

有时我们习惯上把基类中属性的赋值权限放在它的构造方法上,这样给我们感觉更直接,也更安全,这也体现了面向对象的封装性,即将不想开放的东西隐藏到类内部,当进行.net3.5时代后,属性的定义显得更加美观和合理,看下面是几种具有不同读写权限的属性. 1 /// <summary> 2 /// 完全公开 3 /// </summary> 4 public string ErrorMessage { get; set; } 5 /// <summary> 6 /// 读完全公开,

代码-JAVA如何访问带中文的文件链接,并且读取文件,保存到指定的位置下(非弹窗保存文件)

问题描述 JAVA如何访问带中文的文件链接,并且读取文件,保存到指定的位置下(非弹窗保存文件) 求助: 一个文件链接例如 http://192.168.0.12:8080/hr/uploads/12_15574/english_name.txt,我通过java自带的url访问,然后获取这个url的输入流,然后将它保存到指定目录下,是成功地. 现在,服务器上的文件已经访问路径是带中文的,例如http://192.168.0.12:8080/hr/uploads/12_15574/english_n

Java Lambda 表达式详解及示例代码_java

Java Lambda 表达式是 Java 8 引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于 Javascript 中的闭包,但又有些不同,主要目的是提供一个函数化的语法来简化我们的编码. Lambda 基本语法 Lambda 的基本结构为 (arguments) -> body,有如下几种情况: 参数类型可推导时,不需要指定类型,如 (a) -> System.out.println(a) 当只有一个参数且类型可推导时,不强制写 (), 如 a -> System.o

10个Java 8 Lambda表达式经典示例

Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码.而定义行为最重要的那行代码,却混在中间不够突出.Lambda表达式取代了匿名 类,取消了模板,允许用函数式风格编写代码.这样有时可读性更好,表达更清晰.在Java生态系统中,函数式表达与对面向对象的全面支持是个激动人心的进 步

lambda表达式

什么时候使用lambda表达式 lambda表达式定义 lambda表达式语法 lambda表达式理解 lambda表达式使用 lambda表达式的泛型使用 什么时候使用lambda表达式 如果一段代码需要延迟执行,就可以使用lambda表达式,如在另外的线程运行的一段代码.需要在某个时间点运行的代码.某个条件触发回调的代码等. lambda表达式定义 lambda表达式是一段可以传递的.可以执行的代码.之所以叫这个名字是因为lambda表达式是一个带参数变量的表达式,而在数学里面带参数的表达式

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一)

Constructs a closure: an unnamed function object capable of capturing variables in scope. -- Lambda functions (since C++11) [cppreference.com] 按照C++11标准的说法,lambda表达式的标准格式如下: [ capture ] ( params ) mutable exception attribute -> ret { body } // (1) 完整

伴着代码,那个女孩儿慢慢长大

      伴着代码,那个女孩儿慢慢长大       岁月荏苒,浅夏将一种极致的婉约,律动在代码的世界里,小编轻轻走过一个又一个项目,感恩这份美好.每个波澜不惊的日子,都散发着恬淡的香,那是时光沉淀的馨香,那是代码独有的味道,小编倔强认为,最长久的幸福,是来自平凡日子里点点滴滴滴的积累.繁华落尽终究是平淡,代码的美,不在于绚丽,而贵在坚持:IT的美,不在于轰轰烈烈,而在于平凡的坚守,温暖的陪伴.阳光依然灿烂,明天依然向往.秉持着心中的梦想去激情燃烧.这个八月,与阳光同行,带梦想前行,努力抵达内心

快速入门Java中的Lambda表达式_java

Lambda简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块). Lambda表达式还增强了集合库. Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及 java.util.stream 包. 流(stream)就如同迭代器(iterator),但附加了许多