龙空技术网

为什么会出现Lambda表达式,你知道吗?

老顾聊技术 34775

前言:

而今兄弟们对“lambda表达式的原理”大概比较关切,姐妹们都想要学习一些“lambda表达式的原理”的相关文章。那么小编在网络上搜集了一些有关“lambda表达式的原理””的相关文章,希望看官们能喜欢,你们快快来学习一下吧!

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工

目录前言案例改造策略模式匿名类Lambda表达式总结前言

Java8有一些新的特性,今天老顾给大家分享一下关于Lambda表达式的由来,一开始感觉Lambda可读性蛮差的,不知道为什么Java8会出来这个表达式?既然大佬们推出来,肯定是有原因的,应该是为了解决一些问题,那我们就看看解决了什么问题?

案例

班导想了解一下各个同学的相关情况:

1、来自苏州的有哪些同学

上面的伪代码,是不是很简单,写一个方法,直接过滤出苏州地区的学生。

班导又想知道来自北京的有哪些同学,那代码执行优化一下,可以动态传地区参数。

2、地区参数化

这样是不是就解决了,所有地区的查询问题,把地区作为一个参数。

问题好像得到了解决,突然班导又要知道同学们的年龄分布。

3、可以查出20岁以上的学生

这一次直接到位,把年龄参数化。

我们发现因为班导的两个需求,根据地区和年龄查找学生,我们程序员提供了两个方法,filterStudentByArea和filterStudentByAge。

我们小伙伴们有没有发现,此两个方法里面的代码是不是很像,有很多重复的代码。不过满足需求就行了,还能接受是吧。

改造

因为上面是两个方法,很多小伙伴会想到可以改成一个方法,用flag标记查询的业务。

改为一个方法,flag为true 表示根据年龄范围查找学生;flag为false,表示查地区里面的学生

调用方式

List<Student> areaStudentList = filterStudent(students,"苏州",0,false);List<Student> ageStudentList = filterStudent(students,"",20,true);

虽然改造了一个方法,但实现方式比较恶心。

小伙伴们会说那就不要优化了,两个方法就两个呗。其实如果需求不变了,这样也是没问题的,但如果班导又提出要根据学生成绩进行查询,或又要根据学生的体重、身高等;每增加一个维度都要写相应的方法,导致很多重复的代码。

作为一个有上进心的,有追求的程序员,这种方案感觉很变扭,要想个方法解决。突然想到了JAVA的设计模式,是不是可以用这个解决啊,我们来看看。

策略模式

还好我们的小伙伴们知道一点设计模式,那用策略模式进行改造吧

定义一个接口,用来进行过滤的接口,我们可以实现这个接口,去完成不同的需求,如:

上面定义了两种查询条件,都是实现了StudentPredicate接口,那我们再看看主方法

上面的核心代码就是p.test(stu);这个就是查询条件逻辑实现方法;要查询某个业务,只需要把相关业务的接口实现传给这个主方法就行了。

上面的方式代码相对比较优美,如有别的查询需求,只要实现StudentPredicate接口就行了。但这点也是个缺点,每个需求都要去写相关的接口实现。

匿名类

为了解决接口实现太多,可以采用匿名类去解决,再来优化一下

这种方式大大的减少了接口实现类,需要什么业务需求,直接在调用方法的时候建立匿名类去实现就行了。

匿名类的方式,我们的大佬觉得还是不够简洁,所以Java8中新增了Lambda表达式,我们看看。

Lambda表达式

我们来看看Lambda表达式的实现

小伙伴们看看,是不是很简洁。

总结

每个技术的出现肯定是为了解决一些问题的,小伙伴们在学习的时候,一定要知道为什么,解决什么问题,这样会对我们了解这个技术点更深入,下一篇老顾再来说说Lambda表达式的具体用法,谢谢!!!

-End-

推荐阅读

1、不说“分布式事务”理论,直接上大厂阿里的解决方案,绝对实用

2、女程序员问到这个问题,让我思考了半天,Mysql的“三高”架构

3、大厂二面:CAP原则为什么只能满足其中两项?而不能同时满足

4、阿里P7二面:聊聊零拷贝的原理

5、秒杀系统的核心点都在这里,快来取

6、你了解如何利用token方式实现分布式Session吗?

7、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂

8、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调

9、企业实战Redis全方面思考,你思考了吗?

10、面试题:Thread的start和run的区别

11、面试题:什么是CAS?CAS的作用以及缺点

12、如何访问redis中的海量数据?避免事故产生

13、如何解决Redis热点问题?以及如何发现热点?

14、如何设计API接口,实现统一格式返回?

15、你真的知道在生产环境下如何部署tomcat吗?

16、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案

17、分享大厂分布式唯一ID设计方案,快来围观

18、你想了解一线大厂的分布式唯一ID生成方案吗?

19、你知道如何处理大数据量吗?(数据拆分篇)

20、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)

21、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?

22、你了解大型网站的页面静态化吗?

23、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?

24、你知道怎么解决DB读写分离,导致数据不一致问题吗?

25、DB读写分离情况下,如何解决缓存和数据库不一致性问题?

26、你真的知道怎么使用缓存吗?

27、如何利用锁,防止缓存击穿?重构思想的重要性

28、海量订单产生的业务高峰期,如何避免消息的重复消费?

29、你知道如何保障生产端100%消息投递成功吗?

30、微服务下的分布式session该如何管理?

标签: #lambda表达式的原理