为什么推荐使用Lamda表达式

本文详细介绍了C#中的委托、匿名委托与Lambda表达式的概念及应用,通过实例展示了它们之间的关系与差异,强调了Lambda表达式在代码简洁性和功能性上的优势。
为什么推荐使用Lamda表达式
2011-02-23 10:51

最近参加一次培训的时候,发现部分人对委托这个概念很模糊,委托这些概念是.NET高级编程中的,当一个程序员经过一个阶段的学习之后,想要有一个提高,这时候学习这些概念就是必须的了,所以在讲Lamda表达式时,把这委托,匿名委托(匿名方法),Lamda表达式这几个概念整理了一下。

网上这方面的例子很多,但是对于起步阶段的人来说,这些例子显的晦涩了,所以我举得例子中,为了更清楚的说明这三者的关系,将淡化其内部实现的功能。

首先讲委托,在.NET中,委托这个概念有点类似于C/C++中的函数指针,但与指针不同的是,委托是一种安全的类型,那么我们就以实现两个数的差值为例,首先声明返回值为int的一个成员方法:

public int CompareTwoValue(int a, int b) { int c=a-b; return c; } 接着声明一个委托:

public delegate int deleMethod(int a,int b); 然后,我们可以通过这个委托调用这个上面的成员方法,

public int Show() { deleMethod d1 = new deleMethod(CompareTwoValue); return d1(5,10); }
那么,关于委托的概念,我就讲到这里,接着说明一下,匿名委托,其实也称作匿名方法,其实,这只是一种语法形式上的变化,因为编译的时候,还是要进行类型匹配的,那么对于上面的Show方法,我可以使用匿名委托的方式来表达

public int Show1() { deleMethod d2 = delegate(int a, int b) { int c=a-b; return c; }; return d2(5,10); } 可以看出,语法形式上简便了,所以我个人觉得匿名委托在C#2.0中并没有实质性的用处,因为到3.0时,涉及到Lamda表达式时,才真正的有用处,那么上面的方法,如果用Lamda表达式表述如下:

public int Show2() { Func<int, int, int> f = ( a,b) => { return a - b; }; return f(5,10); }初次接触Lamda表达式时感觉很难懂,但是一旦理解了之后,我就很喜欢这种表达方式,其实,Lamda表达式只是匿名委托的一种表现形式,从上面的结果可以很直观的看出,三种方式中,Lamda表达式编写的代码量最少,最后看一下执行的结果

TestExample test = new TestExample(); Console.WriteLine(test.Show()); Console.WriteLine(test.Show1()); Console.WriteLine(test.Show2());结果是一致的,其实三者的功能是一致的,只是表现形式不一样,而三种方法中,Lamda表达式编写的代码量最少。


在 Spring Boot 的 Service 层中,可以使用 Lambda 表达式结合 `TaskExecutor` 手动提交异步任务,这种方式提供了更灵活的任务调度控制能力。通过 `execute` 方法提交的 `Runnable` 任务可以直接使用 Lambda 表达式定义任务逻辑,从而简化代码结构并提升可读性。 以下是一个在 Service 层使用 Lambda 表达式配合线程池手动提交异步任务的示例: ```java @Service public class AsyncTaskService { @Autowired @Qualifier("customTaskExecutor") private TaskExecutor taskExecutor; public void triggerAsyncTask() { taskExecutor.execute(() -> { // 异步任务逻辑 System.out.println("异步任务正在执行,线程名:" + Thread.currentThread().getName()); }); } } ``` 在上述代码中,`TaskExecutor` 被注入并使用 `execute` 方法提交了一个由 Lambda 表达式定义的 `Runnable` 任务,该任务将在指定的线程池中异步执行[^1]。 为了确保线程池的可用性,需要在配置类中定义并初始化线程池 Bean: ```java @Configuration @EnableAsync public class AsyncConfig { @Bean(name = "customTaskExecutor") public TaskExecutor customTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(100); executor.setThreadNamePrefix("AsyncExecutor-"); executor.setWaitForTasksToCompleteOnShutdown(true); executor.initialize(); return executor; } } ``` 该配置定义了一个具备基本调度能力的线程池,核心线程数为 5,最大线程数为 10,任务队列容量为 100,并设置了线程名称前缀和关闭时等待任务完成的策略。 通过这种方式,可以在 Service 层实现对异步任务的细粒度控制,同时保持代码简洁和结构清晰。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值