为什么使用Lambda表达式

1e242afad1264d37a2a3cbd1e65df2a0.jpg

 视频地址: https://b23.tv/gfH0PjR

在使用Lambda表达式之前,先看一下 匿名内部类的一个使用。

匿名内部类详情:http://t.csdn.cn/nMZpB

cffc26e18a4f4a8d83763c35f7adf725.jpg

    匿名内部类,就是没有名字的一种嵌套类。它是Java对类的定义方式之一,在实际开发中,我们常常遇到这样的情况:一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。

当我们new出了匿名内部类时,可以用类名当做参数进行传递。

虽然匿名内部类对于只需要执行一次的代码的方法的调用,已经相当简便,但是还是显得有一些冗余。这时Lambda表达式就再次简化了这个“痛点”5fdb1e21af1240cf9912a8c3e78259c6.jpg

     当然仅靠上面两行代码还是没有太大的“感觉”。

     假设现在有一个需求:获取当前公司大于35岁的程序员,然后进行统一开除

c6e6783db134476eb0b58860f2db9f21.jpg

创建员工实体类

b9b9a5dc8ed445278b883a66a15e084f.jpg

把员工信息放到一个List集合中

这里用到 Arrays.asList( )方法, 该方法是将数组转化成List集合的方法。

该方法详情:http://t.csdn.cn/rqFqo

b1401fbd54814b15b42f40db971606c4.jpg

写一个方法遍历上面的集合,并把大于等于35岁的员工放到一个新的员工集合并返回

c7d34e9117944eb2be948edc6bb23679.jpg

 

测试该方法,取出大于等于35岁的员工

f56e2106dd6145c38aabc025542ddca5.jpg

但是,当我们的需求改变为,查询出公司工资大于等于5K的员工开除时,就会发现可以把上面的代码完全复制过来,只改一下遍历集合的条件就行,对于秉持着“重复的代码只写一遍”的原则,这样简直不要太过冗余。

fc19fa8f9bdd40ffb39cc605d767f428.jpg

现在我们对代码进行进一步的优化,引入策略设计模式,给入某种策略方式就按照某种策略方式进行逻辑处理

策略设计模式详情:http://t.csdn.cn/6plTD

1 首先声明一个泛型接口

56260221a47242a2887836171058e930.jpg

2 创建一个实现类对该接口进行实现

1c1808c3537d4b5ea488a6b722326d81.jpg

3 写一个方法,参数是员工集合和声明的泛型接口d3601a00108c460e8c07573165c7272d.jpg

4 测试方法,调用filterEmployee()传入一个员工集合,和接口实现类5364d8e81dda42878a8d797ad9790493.jpg

当我们再次添加过滤条件时只需要再写一个实现类去实现带有泛型的接口,只是实现里面的抽象方法的返回条件不同d619758298b04bfb8c622eda262c96d0.jpg

然后在测试方法里面再次调用filtreEmoliyee()方法,同样传入一个员工集合和一个人接口实现类就可以得到一个不同过滤条件的不同员工集合

42303afe7d7b48c9b1f7554320494423.jpg

但是问题又来了,我们为了一段简短的代码去重新new了一个类,我说年轻人这样好吗?这不好,所以我们再次回到匿名内部类的形式,直接在filterEmployee()里面new MyPredicate调用test()方法传入Employee添加过滤条件,filterEmployee()返回一个过滤后的list集合,foreach遍历出过滤后的集合,这样我们就不需要去new一个实现类去实现MyPredicate接口再去实习抽象方法了。

42ecf0984b08477cadcfd3884b4ea65f.jpg

那么问题又来了,这样代码就优雅了吗?NO,别忘了我们今天的 “猪脚”是Lambda表达式

那么我们看一下用Lambda表达式对匿名内部类的优化,当然还是得调用 filterEmployee()方法。

dea8479462964f9e8c35d179e05e547c.jpg

从原本每个过滤条件都需要调用不同的filterEmployee()方法添加不同的过滤条件,里面代码简直是复制粘贴。到引入策略模式,只需要调用同一个filterEmployee()方法,通过形参传入不同的接口实现类。再到通过调用filterEmployee()方法传入一个匿名内部类,在匿名内部类中添加过滤条件。到最后的Lambda表达式只需要一行代码

List<Employee> list = filterEmployee(employee,(e)-> e.getsalary<=5000);

Lambda表达式的作用就不言而喻了。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值