为什么使用Lambda表达式?
- 使编写匿名内部类更加简洁
-
在默写特殊的情况下我们可能要建立一个类来实现某一个接口,覆写其中的一个方法,来完成一些自定义的功能,而往往这种操作只需要使用一次,或者很少使用,这种情况下使用匿名内部类来解决一次性的使用情况,
-
然而匿名内部类中真正有用到的只有其中一小部分代码,但是由于java旧版本的语法要求,需要编写多余的代码格式.
-
反面示例:比较器
Comparator<String> myConparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(),o2.length());
}
};
- 使用Lambda表达式简化上述代码
Comparator<String> myCOmparator = (x,y) ->Integer.compare(x.length(),y.length());
- 假设一个需举例:
- 假设现在有一堆雇员数据,包含了每个雇员的姓名,年龄,工资等基本信息,那么如果要求写一个方法来查询所有年龄大于35岁的雇员
- 再假设,有要求写一个查询工资大于5000的雇员的方法.
- 那么如果只是实现功能的情况下,代码编写可能是以下的形式
public List<Employee> selectByAge(List<Employee> employees){
List<Employee> temp = new ArrayList<>();
for(Employee employee:employees){
if(employee.getAge() >= 30){
temp.add(employee);
}
}
return temp;
}
public List<Employee> selectBySarlay(List<Employee> employees){
...
return temp;
}
......
- 为每一种查询条件编写一个查询方法,这样的代码,除了判断语句之外,其他的几乎相同,所以需要进行优化处理.
- 如果要进行优化可以采用策略模式来重构代码.
- 既然我们发现只有判断条件不一致,那么我们可以定义一个接口来进行条件判断
package mao.shu;
public interface EmployeeCom<T> {
boolean test(T t);
}
- 如果我们要定义新的判断规则只需要定义一个类实现EmployeeCom接口即可,例如我们要进行年龄大于30的判断
public class EmployeeComByAge implements EmployeeCom<Employee> {
@Override
public boolean test(Employee employee) {
return employee.getAge() >= 30;
}
}
- 而我们的查询方法只需要定义一个即可,判断条件改为接口中的test()方法进行比较
public List<Employee> selectEmployee(List<Employee> employees,EmployeeCom<Employee> employeeCom){
List<Employee> temp = new ArrayList<>();
for(Employee employee:employees){
// 使用接口中的方法进行判断
if(employeeCom.test(employee)){
temp.add(employee);
}
}
return temp;
}
-
这样当我们进行查询的时候只需要传入一个实现接口的子类对象即可,但是每个查询条件都定义一个实现类的话有点多余,可以直接使用匿名内部类来使用,而匿名内部类则可以使用Lambda表达式来代替简化代码.
-
正确示例:
@Test
public void test4() {
List<Employee> employeesByAge = selectEmployee(employeeList, (x) -> x.getAge() >= 30);
employeesByAge.forEach(System.out::println);
System.out.println("=================================>");
List<Employee> employeesBySalary = selectEmployee(employeeList, (x) -> x.getSarlay() >= 5000.0);
employeesBySalary.forEach(System.out::println);
}
- 控制台输出结果
总结:
- Lambda表达式可以大大简化匿名内部类的代码量,可以更加清晰的展示主要代码,增强整体代码的可读性.
- 如果可以克服一下编码的习惯,学习一下Lambda表达式的语法,可以大大提高开发效率.