浅谈对Lambda表达式的理解
在.NET 1.0的时候,大家都知道我们经常用到的是委托。有了委托呢,我们就可以像传递变量一样的传递方法。在一定程序上来讲,委托是一种强类型的托管的方法指 针,曾经也一时被我们用的那叫一个广泛呀,但是总的来说委托使用起来还是有一些繁琐。来看看使用一个委托一共要以下几个步骤:
用delegate关键字创建一个委托,包括声明返回值和参数类型
使用的地方接收这个委托
创建这个委托的实例并指定一个返回值和参数类型匹配的方法传递过去
好啦,我承认啦上面是自己在网上看到的,但是它很好的介绍了委托,在以前要使用委托的话,就必须要进过上面的3个不步奏,在我看来真的觉得是挺繁杂的,所以主题来了Lambda表达式,它可以通过匿名的方法来绕过步奏2,所以我只需要定义一个委托后,再使用Lambda表达式来实现委托,下面写一个小小的例子看看吧:
// 编译器不知道后面到底是什么玩意,所以我们这里不能用var关键字
Action dummyLambda = () => { Console.WriteLine("Hello World from a Lambda expression!"); }; // double y = square(25); Func<double, double> square = x => x * x; // double z = product(9, 5); Func<double, double, double> product = (x, y) => x * y; // printProduct(9, 5); Action<double, double> printProduct = (x, y) => { Console.WriteLine(x * y); }; // var sum = dotProduct(new double[] { 1, 2, 3 }, new double[] { 4, 5, 6 }); Func<double[], double[], double> dotProduct = (x, y) => { var dim = Math.Min(x.Length, y.Length); var sum = 0.0; for (var i = 0; i != dim; i++) sum += x[i] + y[i]; return sum; }; // var result = matrixVectorProductAsync(...); Func<double, double, Task<double>> matrixVectorProductAsync = async (x, y) => { var sum = 0.0; /* do some stuff using await ... */ return sum; };
从上面的代码中我们可以看出:
如果只有一个参数,不需要写()
如果只有一条执行语句,并且我们要返回它,就不需要{},并且不用写return
Lambda可以异步执行,只要在前面加上async关键字即可
Var关键字在大多数情况下都不能使用
以上所述就是本文的全部内容了,希望大家能够喜欢。
相关推荐
-
C++中的Lambda表达式详解
我是搞C++的 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C++代码了.今天看到了C++中的Lambda表达式,虽然用过C#的,但是C++的,一直没有用,也不知道怎么用,就可怜的连Lambda语法都看不懂.好了,这里就对C++中的Lambda进行一个简单的总结,就算是对自己的一个交代,我是搞C++的,我是一个C++ programmer. 一段简单的Code 我也不是文艺的人,对于Lambda的
-
让JavaScript拥有类似Lambda表达式编程能力的方法
但是我后来也跟人说,因为接受的参数太多,所以如果不把智能提示写得很清楚的话,连我自己都常常搞不清楚该怎么用. 不过,接受参数多,除了容易弄错用法以外,还会产生另一个问题,这也是我编写出今天发布的这个东西的原因. 来看一下JS版的页码呈现组件的完全版函数签名: 复制代码 代码如下: function pnView( currentPage, actionCurrent, beginPage, endPage, actionBegin, actionEnd, currentSiblings, act
-
C# Lambda表达式用途深入理解
假如我们想要从一个整型数组中取出其中是奇数的选项,其实现方式有很多,我们通过下面三种实现方式来对对比理解Lambda表达式的用途 方法一:命名方法 复制代码 代码如下: public class Common { public delegate bool IntFilter(int i); public static List<int> FilterArrayOfInt(int[] ints, IntFilter filter) { var lstOddInt = new List<in
-
Java Lambda表达式详解和实例
简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块). Lambda表达式还增强了集合库. Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及 java.util.stream 包. 流(stream)就如同迭代器(iterator),但附加了许多额外的功能.
-
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
在发了博文之后,我又花了一些时间尝试解决这个问题--经过几次尝试之后,我找到了另一种pattern,括号并不再是必要的了: 复制代码 代码如下: eval(function () { var s = '', ww = [v] > (s += v); var ws = [n] > ww(' <A href="#">(' + n + ')</A> '); pnView3(14, [n] > ww(' [' + n + '] '), 1, 37, w
-
C#中使用Lambda表达式自定义比较器实现两个列表合并实例
一次项目有这样的需求,本地存储了json数据,可以转化为对应的List列表,现在需要更新,从服务器那里获取最新的数据更改.总的来说就是本地有个List表,如果数据需要更新,则会向服务器发送请求来获取需要更改的部分List表格,然后客户端这边就要去处理合并完整这次的更新,弄了一个下午,终于搞定,这次来mark一下. 主要推送的数据的两个特性: 1.如果之前的列表需要增加,则出现在最新的数据推送List中 2.如果数据需要修改的话,则一样推送更新,保持id不变,内容有所改变 示例代码如下图: 复制代
-
python基础教程之lambda表达式使用方法
Python中,如果函数体是一个单独的return expression语句,开发者可以选择使用特殊的lambda表达式形式替换该函数: 复制代码 代码如下: lambda parameters: expression lambda表达式相当于函数体为单个return语句的普通函数的匿名函数.请注意,lambda语法并没有使用return关键字.开发者可以在任何可以使用函数引用的位置使用lambda表达式.在开发者想要使用一个简单函数作为参数或者返回值时,使用lambda表达式是很方便的.下面是
-
浅谈对Lambda表达式的理解
在.NET 1.0的时候,大家都知道我们经常用到的是委托.有了委托呢,我们就可以像传递变量一样的传递方法.在一定程序上来讲,委托是一种强类型的托管的方法指 针,曾经也一时被我们用的那叫一个广泛呀,但是总的来说委托使用起来还是有一些繁琐.来看看使用一个委托一共要以下几个步骤: 用delegate关键字创建一个委托,包括声明返回值和参数类型 使用的地方接收这个委托 创建这个委托的实例并指定一个返回值和参数类型匹配的方法传递过去 好啦,我承认啦上面是自己在网上看到的,但是它很好的介绍了委托,在以前要使
-
浅谈对yield的初步理解
如下所示: def go(): while True: data = 1 r = yield data # data是返回值,r是接收值 print("data", data) print("A1", r) data += 1 r = yield data print("data",data) r += r print("A2", r) data += 1 r = yield data print("data&quo
-
浅谈对于DAO设计模式的理解
为了降低耦合性,提出了DAO封装数据库操作的设计模式. 它可以实现业务逻辑与数据库访问相分离.相对来说,数据库是比较稳定的,其中DAO组件依赖于数据库系统,提供数据库访问的接口. 一般的DAO的封装由以下另个原则: · 一个表对应一个表,相应地封装一个DAO类. · 对于DAO接口,必须由具体的类型定义.这样可以避免被错误地调用. 在DAO模式中,将对数据的持久化抽取到DAO层,暴露出Service层让程序员使用,这样,一方面避免了业务代码中混杂JDBC调用语句,使得业务落实实现更加清晰.
-
浅谈关于C++memory_order的理解
看了c++并发编程实战的内存模型部分后,一直对memory_order不太懂,今天在知乎发现了百度的brpc,恰好有关于原子操作的文档,感觉解释的很好.为了加深理解,再次总结一遍. 在多核编程中,我们使用锁来避免多个线程修改同一个数据时产生的竞争条件.但是,锁会消耗系统资源,当锁成为性能瓶颈的时候,就需要使用另一种方法--原子指令.c++11中引入了原子类型atomic. 原子指令 (x均为std::atomic) 作用x.load()返回x的值.x.store(n)把x设为n,什么都不返回.x
-
浅谈TypeScript 索引签名的理解
目录 1.什么是索引签名 2. 索引签名语法 3. 索引签名的注意事项 3.1不存在的属性 3.2 string 和 number 键 4.索引签名与 Record<Keys, Type>对比 我们用两个对象来描述两个码农的工资: const salary1 = { baseSalary: 100_000, yearlyBonus: 20_000 }; const salary2 = { contractSalary: 110_000 }; 然后写一个获取总工资的函数 function tot
-
Java8中Lambda表达式的理解与应用
目录 简介 正文 1. lambda的语法 2. 为啥引入lambda 3. 什么是函数式接口 4. 什么是行为参数化 5. 手写一个函数式接口 6. 常用的函数式接口 7. 什么是方法引用 8. 什么是构造引用 9. lambda表达式中引入外部变量的限制 10. lambda的组合操作 总结 简介 Lambda表达式是一个可传递的代码块,可以在以后执行一次或多次: 下面贴个对比代码: // Java8之前:旧的写法 Runnable runnable = new Runnable() { @
-
浅谈jsp EL表达式取值过程、page和pagecontext的区别
1.EL表达式解析过程 JSP中,我们经常会写为${obj.name}字样,但你有没有想过,它的取值过程是什么,属性值从哪取得? ${obj}相当于 request.getAttribute("obj"),这句话严格来说不严谨,依次的请求范围是page.request.session.application 也就是说,如果在page.getAttribute()找不到,再去request.getAttribute,如果request找不到,再去session里找,session里找不到
-
浅谈对c# 面向对象的理解
一.了解面向对象 1.概念基本理解:1).一个个体可以看做是一个对象,例如:人这个个体: 2).有共同属性的一类作为一个个体,例如:学生.白领.农民工: 3).结构体是用户自定义的数据类型,可以定义不同数据类型的变量,结构体也是面向对象的核心: 2.基本特性: 1)封装:是隐藏信息的特性,具有"封装"意识,是掌握面向对象分析与设计技巧的关键. 最简单的理解:创建一个对象的整体,使对象的属性可以具有赋值.取值的功能,也就是对象中的变量可以赋值.取值.,是一种认为的抽象出来的对象的概念.
-
浅谈javascript 函数表达式和函数声明的区别
javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用. 3).以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而 函数表达式可以在任何地方声明. 下面分别用两种方法定
-
浅谈Java slf4j日志简单理解
一.理解 slf4j(Simple Logging Facade for Java),表示为java提供的简单日志门面,更底层一点说就是接口.通过将程序中的信息导入到日志系统并记录,实现程序和日志系统的解耦 日志门面接口本身通常并没有实际的日志输出能力,它底层还是需要去调用具体的日志框架API的,也就是实际上它需要跟具体的日志框架结合使用.由于具体日志框架比较多,而且互相也大都不兼容,日志门面接口要想实现与任意日志框架结合可能需要对应的桥接器,就好像JDBC与各种不同的数据库之间的结合需要对应的
随机推荐
- 详解Vue2.0里过滤器容易踩到的坑
- javascript unicode与GBK2312(中文)编码转换方法
- iOS实现带文字的圆形头像效果
- Oracle实现分页查询的SQL语法汇总
- SpringMVC文件上传的配置实例详解
- javascript 冒泡排序 正序和倒序实现代码
- js实现div弹出层的方法
- zend framework文件上传功能实例代码
- php实现json编码的方法
- Spring Boot 启动加载数据 CommandLineRunner的使用
- jQuery使用attr()方法同时设置多个属性值用法实例
- linux shell的输出效果修改方法(界面颜色)
- 妙用.htaccess隐藏网页文件扩展名
- 比较详细的手把手教你写批处理(willsort题注版)第1/5页
- JQury slideToggle闪烁问题及解决办法
- 获取select元素被选中的文本内容的js代码
- 详解Nginx 和 PHP 的两种部署方式的对比
- 详解Java中实现SHA1与MD5加密算法的基本方法
- C 语言二叉树几种遍历方法详解及实例
- java调用c程序通信示例代码