Lambda表达式的前世今生(生动详细得我自己都被感动了)

2023-10-07 21:01

本文主要是介绍Lambda表达式的前世今生(生动详细得我自己都被感动了),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Lambda表达式的形成

  • Lambda这个小宝宝出生之前,大家为了把委托或事件写得简洁优雅(其实就是想偷懒),采用了匿名表达式。
  • 可是,在实际使用过程中,大家还想再继续偷点懒,于是就绞尽脑汁地想把匿名表达式不断简化。
  • 所以,Lambda表达式的使用前提是:在委托或事件中使用,单独拎出来使用是会报错的。
  • 首先,我们通过匿名方法,来写一个委托。
delegate int MyDel(int x);
void main(string[] args){MyDel mc += delegate(int x) {return x};
}
  • 因为C#编译器能对返回值类型做出自动判断,mc的值可以被自动识别为MyDel,所以,MyDel这个类型可以直接省略不写,于是代码就被简化成了这样。
delegate int MyDel(int x);
void main(string[] args){mc += delegate(int x) {return x};
}
  • 然而,delegate这个关键字那么长,写起来好麻烦啊,但又不能不写(要用它标明这是委托类型),于是,人们就想着,用=>来代替delegate关键字,读作goes to。
delegate int MyDel(int x);
void main(string[] args){mc += (int x) => {return x};
}
  • 这时候,大家在想,既然我在定义委托类型的时候,已经写了参数类型,那我在写匿名函数的时候,再写一遍参数类型不就重复了吗?于是再省略一点,就出现了Lambda表达式的基础形态,后续的Lambda表达式在此基础上,出现各种演变。
delegate int MyDel(int x);
void main(string[] args){mc += (x) => {return x};
}

有参无返回值

Action<string> action = msg => Console.WriteLine(msg);
action("")

有参有返回值

Func<int, int> func = (x) =>{return x + 100;};
int result = func(900);
  • 对于只有一个参数的方法体,可以省略括号;对于只有一行语句的方法体,可以省略大括号和return。
  • 于是,进一步简化。
Func<int, int> func = x => x + 100;
int result = func(900);

Lambda作为参数

  • 这是非常装B的写法。
int[] arr = { 1, 2, 3, 4, 5, 6, 7 };
// Count其实是一个委托,统计满足条件体的元素个数
Console.WriteLine($"数组中有{arr.Count(x => x % 2 == 1)}个奇数");

这篇关于Lambda表达式的前世今生(生动详细得我自己都被感动了)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160422

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变