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

相关文章

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

SpringBoot @Scheduled Cron表达式使用方式

《SpringBoot@ScheduledCron表达式使用方式》:本文主要介绍SpringBoot@ScheduledCron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有... 目录Cron 表达式详解1. 表达式格式‌2. 特殊字符解析3. 常用示例‌4. 重点规则5. 动态与复杂场景‌

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Centos环境下Tomcat虚拟主机配置详细教程

《Centos环境下Tomcat虚拟主机配置详细教程》这篇文章主要讲的是在CentOS系统上,如何一步步配置Tomcat的虚拟主机,内容很简单,从目录准备到配置文件修改,再到重启和测试,手把手带你搞定... 目录1. 准备虚拟主机的目录和内容创建目录添加测试文件2. 修改 Tomcat 的 server.X