视频地址: https://b23.tv/gfH0PjR
在使用Lambda表达式之前,先看一下 匿名内部类的一个使用。
匿名内部类详情:http://t.csdn.cn/nMZpB
匿名内部类,就是没有名字的一种嵌套类。它是Java对类的定义方式之一,在实际开发中,我们常常遇到这样的情况:一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。
当我们new出了匿名内部类时,可以用类名当做参数进行传递。
虽然匿名内部类对于只需要执行一次的代码的方法的调用,已经相当简便,但是还是显得有一些冗余。这时Lambda表达式就再次简化了这个“痛点”
当然仅靠上面两行代码还是没有太大的“感觉”。
假设现在有一个需求:获取当前公司大于35岁的程序员,然后进行统一开除
创建员工实体类
把员工信息放到一个List集合中
这里用到 Arrays.asList( )方法, 该方法是将数组转化成List集合的方法。
该方法详情:http://t.csdn.cn/rqFqo
写一个方法遍历上面的集合,并把大于等于35岁的员工放到一个新的员工集合并返回
测试该方法,取出大于等于35岁的员工
但是,当我们的需求改变为,查询出公司工资大于等于5K的员工开除时,就会发现可以把上面的代码完全复制过来,只改一下遍历集合的条件就行,对于秉持着“重复的代码只写一遍”的原则,这样简直不要太过冗余。
现在我们对代码进行进一步的优化,引入策略设计模式,给入某种策略方式就按照某种策略方式进行逻辑处理
策略设计模式详情:http://t.csdn.cn/6plTD
1 首先声明一个泛型接口
2 创建一个实现类对该接口进行实现
3 写一个方法,参数是员工集合和声明的泛型接口
4 测试方法,调用filterEmployee()传入一个员工集合,和接口实现类
当我们再次添加过滤条件时只需要再写一个实现类去实现带有泛型的接口,只是实现里面的抽象方法的返回条件不同
然后在测试方法里面再次调用filtreEmoliyee()方法,同样传入一个员工集合和一个人接口实现类就可以得到一个不同过滤条件的不同员工集合
但是问题又来了,我们为了一段简短的代码去重新new了一个类,我说年轻人这样好吗?这不好,所以我们再次回到匿名内部类的形式,直接在filterEmployee()里面new MyPredicate调用test()方法传入Employee添加过滤条件,filterEmployee()返回一个过滤后的list集合,foreach遍历出过滤后的集合,这样我们就不需要去new一个实现类去实现MyPredicate接口再去实习抽象方法了。
那么问题又来了,这样代码就优雅了吗?NO,别忘了我们今天的 “猪脚”是Lambda表达式
那么我们看一下用Lambda表达式对匿名内部类的优化,当然还是得调用 filterEmployee()方法。
从原本每个过滤条件都需要调用不同的filterEmployee()方法添加不同的过滤条件,里面代码简直是复制粘贴。到引入策略模式,只需要调用同一个filterEmployee()方法,通过形参传入不同的接口实现类。再到通过调用filterEmployee()方法传入一个匿名内部类,在匿名内部类中添加过滤条件。到最后的Lambda表达式只需要一行代码
List<Employee> list = filterEmployee(employee,(e)-> e.getsalary<=5000);
Lambda表达式的作用就不言而喻了。