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);

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

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

正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。有需要的同学可以在公众号【Java知己】,发送【面试】领取最新面试资料攻略!暗号【1024】千万不要发,否则.....

4、使用JAVA 的设计模式

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

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

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

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

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

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

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

这种方式大大的减少了接口实现类,需要什么业务需求,直接在调用方法的时候建立匿名类去实现就行了。匿名类的方式,我们的大佬觉得还是不够简洁,所以 Java8 中新增了 Lambda 表达式,我们看看。

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

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

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


“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!

关注公众号:「Java 知己」,每天更新 Java 知识哦,期待你的到来!

  • 发送「面试」,领取 BATJ 面试资料、面试视频攻略。
  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。
  • 千万不要发送「1024」,否则......

做了这么久的程序员,你知道为什么会有 Lambda 表达式吗?的更多相关文章

  1. 做一个聪明的.net程序员

    最近看了传智播客(http://net.itcast.cn/)的.net培训视频,感受颇深,忍不住要把感受写下来跟网友分享一下. 我从接触.net到现在已经至少过去了三五个年头,用.net也已经做了若 ...

  2. 做一名合格的程序员(learning of a previous team)

    合格程序员的基本素质 作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具 有的素质.  1 团队精神和协作能力 把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备 ...

  3. Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)

    今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...

  4. 因写太多 BUG!程序员遭公司颁奖羞辱,做的一个比一个绝​

    刚入职的程序员新人,办公桌上,基本上也就一电脑.一键盘.一鼠标,再配个被杯子.然而混迹职场多年的猿老们,办公桌上都有一些彰显身份地位的“好东西”. 这张图两点颇多,最显眼的,是办公桌上那个黄黄的东西, ...

  5. 关于APP程序员泡沫经济

    这些年,移动互联网非常火,火到掀起学习iOS.安卓以及H5的热潮.有人将这些新技术作为自己的实力补充,增加竞争力:更多的人将它们作为主业,专职做移动开发.但是,即便有移动开发人员不断涌入,对整个行业来 ...

  6. Win8 WinRT将替换Win32 API程序员何去何从?

    win8 新引入了称为WinRT的核心API.支持使用C/C++..NET或JavaScript来开发Metro风格的应用.这些应用自动获得硬件加速和高级电源管理的功能.现有的Silverlight和 ...

  7. 十年京东Java程序员的工作总结,写给迷茫中的你!

    很多年前,刚刚从大学毕业的时候,很多公司来校招.其中最烂俗的一个面试问题是:“你希望你之后三到五年的发展是什么?”.我当时的标准回答是(原话):“成为在某一方面能够独当一面的技术专家“.后来经历了几家 ...

  8. 一个java程序员的年终总结

    年底了,该给自己写点总结了! 从毕业到现在已经快4年啦,一直在Java的WEB开发行业混迹.我不是牛人,但是自我感觉还算是个合格的程序员,有必要写下自己将近4年来的经历,给自我以提示,给刚入行的朋友提 ...

  9. [Mac A]为什么国外程序员爱用 Mac?

    from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜 ...

随机推荐

  1. centos7.6安装python3.7

    1.安装python3.7后,需要: yum install libffi-devel -y 然后再到python源码目录再make install 重新编译一下. 否则pip安装一些包时会安装不上, ...

  2. 升级Xcode7&iOS9后,出现NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -980X)

    在info.plist里面添加如下内容即可: <key>NSAppTransportSecurity</key> <dict> <key>NSAllow ...

  3. 作为UIApplication单例对象的方法 openURL方法的变化

    作为UIApplication单例对象的方法 openURL: 在iOS开发中经常用来实现在当前应用打开外部链接的需求比如跳转到其他应用,跳转应用隐私设置界面;还有相关API canOpenURL:  ...

  4. svn+apache搭建版本控制服务器

    Centos7(linux)搭建版本控制服务器(svn+apache) 1.简介: 版本控制服务器: 版本控制(Revision control)是一种软体工程技巧,籍以在开发的过程中,确保由不同人所 ...

  5. mac eclipse maven tomcat 运行错误 tomcat HTTP Status 404

    在mac系统下安装好eclipse, maven以及tomcat, 之后运行一个web的helloworld项目,出现错误 tomcat HTTP Status 404. 查看eclipse cons ...

  6. kali linux中文乱码解决

    命令中输入 LANG=en_US.UTF-8 apt-get install ttf-wqy-microhei xfonts-wqy gnome-tweak-tool

  7. 数据挖掘算法(三)--logistic回归

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 在介绍logistic回归之前先复习几个基础知识点,有助于后 ...

  8. 对于在Dao层,一个DML操作一个事务,升级到Service层,一个用户,一个事务

    原先的连接Connection,只能是来一次,新创建一个连接connection.这样如果事务在Dao层已经默认提交,在service层出错时,对于俩张关联会有俩种不同的结果.为了解决这样的问题,我们 ...

  9. Spring代理模式(jdk动态代理模式)

    有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...

  10. kettle教程---kettle作业调度,附件(excel)配置表名,一个调度完成所有的表操作

    在平时工作当中,会遇到这种情况:复制一个库,几百甚至上千张表,并且无法设置dblink,此时通过kettle可以快速完成该任务. 按照正常的调度,有几百张表,咱们就要写几百个转换去处理,很不科学,下面 ...