Funq之Lambda表达式入门
今天接受了一个Tranning关于.net3.5 framework中的new feature. 其中最不明白的还是Lambda表达式。回来后又仔细的思考了一番,总算有点体会在这里写一下。既然是入门,所以所说的内容是很浅显的东西,如有错误请各位不吝指正,更详细的文章在这。以下的内容我将围绕三个话题来讲:
1. 什么是Lambda表达式?
2. 在什么时候用到它,它有什么优点?
3. Lambda表达式的真面目是什么样的?
什么是Lambda表达式
C# 2.0 (which shipped with VS 2005) introduced the concept of anonymous methods, which allow code blocks to be written "in-line" where delegate values are expected.
Lambda Expressions provide a more concise, functional syntax for writing anonymous methods. They end up being super useful when writing LINQ query expressions - since they provide a very compact and type-safe way to write functions that can be passed as arguments for subsequent evaluation.
这是牛人的解释,翻译过来的意思是:
C#2.0说明了匿名函数的概念,匿名函数就是允许在使用委托的地方通过"in-line"操作来写代码(其实就是delegate(int i) {... 这里...})。Lambda表达式提供了一个更简单更语法化的方式来书写匿名函数。它们在LINQ查询表达式中很有用-因为它们提供了更精简并且类型安全的方法来书写函数,就像传递参数一样用于 subsequent evaluation(不会译了^_^)。
在什么时候用到它,它有什么优点
在什么时候用Lambda表达式呢?其实在LINQ查询语句出来后,用的情况就很少了,不过呢?如果你还工作在.net2.0 或额.net3.0 framework下还是可以用的,你可以对集合操作使用Lambda表达式。但是你不能对简单函数使用Lambda表达式(什么是简单函数呢?下面在说)。至于Lambda表达式的优点也就是简化了coding和增加了类型安全。
Lambda表达式的真面目是什么样的
这个问题我要用3个例子来渐进的说明。
(1)使用Lambda表达式在程序中:
static void Main(string[] args)
{
List<int> myList = new List<int> { 1, 2, 3, 4, 5 };
int val1 = myList.Find(i => i == 4);
Console.WriteLine(val1);
Console.ReadKey();
}
(2)在近一步
static void Main(string[] args)
{
List<int> myList = new List<int> { 1, 2, 3, 4, 5 };
int val2 = myList.Find(delegate(int i) { return (i == 4); });
Console.WriteLine(val2);
Console.ReadKey();
}
看一下区别,我把 i => i == 4表达式改成了一个委托 delegate(int i) { return (i==4); }。实现的效果是一样的,是不是Lambda表达式要简单呢?但是这不是最终的面目。我们在来看一个。
(3)最终的面貌
private static Predicate<int> _tmpList;
static void Main(string[] args)
{
List<int> myList = new List<int> { 1, 2, 3, 4, 5 };
if (_tmpList == null)
{
_tmpList = new Predicate<int>(Compare);
}
int val3 = myList.Find(_tmpList);
Console.WriteLine(val3);
Console.ReadKey();
}
private static bool Compare(int i)
{
return i == 4;
}
OK! 到了这里,我们的目的地就到了,这个程序是我按照反编译的代码重写过来的。这也充分的体现了编译器对我们的代码做哪些工作。我们可以看到在Lambda表达式中的 i == 4 到这里变成了一个函数。 在编译时系统自动的定义了一个临时的Predicate<T>对象,如果你在查看List<T>的Find函数的时候发现,哦,原来这里也是传递一个Predicate<T>参数。所以说,Lambda表达式会在编译的时候被系统自动转化(其实实就是编译器搞得鬼@_@)。最后留一个问题,如果函数传递的参数类型是IEnumerable<T>有会发生什么呢?^_^!
Funq之Lambda表达式入门的更多相关文章
- Java Lambda表达式入门
Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...
- 函数式编程/lambda表达式入门
函数式编程/lambda表达式入门 本篇主要讲解 lambda表达式的入门,涉及为什么使用函数式编程,以及jdk8提供的函数式接口 和 接口的默认方法 等等 1.什么是命令式编程 命令式编程就是我们去 ...
- Lambda表达式入门
Lambda表达式是Java 8的重要更新,也是一个被广大开发者期待已久的新特性,Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接 ...
- Java Lambda表达式入门[转]
原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示 ...
- java8之lambda表达式入门
1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ privat ...
- JAVA 8 主要新特性 ----------------(三)新功能Lambda表达式入门
一.简述 Java为了扩充匿名方法在1.8中新追加的特性.本身Java之前的版本是没有匿名方法的,只有匿名对象. 二.使用 Java中使用匿名方法必须要对应接口中的一个抽象方 ...
- 第一章:Lambda表达式入门概念
要点:将行为像数据一样传递. 一.几种形式 1.没有参数,用()表示 () ->System.out.println("Hello World"); 2.有且仅有一个参数,省 ...
- Lambda 表达式入门,看这篇就够了
说出来怕你们不相信,刚接到物业通知,疫情防控升级了,车辆只能出不能进,每户家庭每天可指派 1 名成员上街采购生活用品.这不是谣言,截个图自证清白,出自洛阳市湖北路街道处. 看来事态严峻,这样看似好心, ...
- lambda表达式入门详解
转自 2018-03-02 Sevenvidia 码农翻身 1.什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个"值". 如果你想把"一块代码 ...
随机推荐
- 解决Eclipse的dropins中svn插件不能加载的问题
在eclipse的dropins中我们将svn的插件放到里边重启我们的ecplise就能正常加载svn插件了,如下图 但是有时候我们删除了svn的项目之后有可能我们的eclipse就不能正常加载svn ...
- Java Resource路径小结
首先一点很重要,Java中不存在标准的相对路径,各种相对路径取资源的方式都是基于某种规则转化为绝对路劲 然后一点也很重要,绝对不要直接使用绝对路径,否则死得很难看 基于以上两点,总结Resource路 ...
- java -- 路径中包含空格怎么处理
@.使用toURI()方法 String rootPath = this.getClass().getClassLoader().getResource(".").toURI(). ...
- Spring MVC密码处理
以下示例显示如何在使用Spring Web MVC框架的表单中使用密码.首先使用Eclipse IDE来创建一个WEB工程,并按照以下步骤使用Spring Web Framework开发基于动态表单的 ...
- 程序运行缺少MSVCR110.dll
Download Visual C++ Redistributable for Visual Studio 2012 Update 4 from Official Microsoft Download ...
- Uva1025 A Spy in the Metro
#include <iostream> #include <cstring> #include <cstdio> using namespace std; ]; ] ...
- 数据库的SQL模式
1.定义:何为MySQL的严格模式,简单来说就是MySQL自身对数据进行严格的校验(格式.长度.类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了 ...
- SAP FI 中4个特殊期间
标准SAP ERP里面有个13-16的4个特殊的会计期间,这4个特殊的会计期间如何使用?作用是什么? SAP记帐期间变式,会计年度与特殊期间. 记帐期间变式是较难理解的一个内容.不过要表达的内容很简单 ...
- YII配置rabbitMQ时前期工作各种坑
背景如下: 项目需要做一个订阅/发布的功能,然后一大堆讨论不做说明,确认使用rabbitMQ来做: okay,既然 要这个来做,我们下载这个东西吧!在官网上下载就okay了,不做说明,下载安装的时候会 ...
- vfptr(2)
//i_vptr struct i_vptr { ; }; //vptr.h #include "i_vptr.h" #include <iostream> class ...