Lambda表達式的優勢
1. 匿名內部類和Lambda的對比
//原來的匿名內部類
@Test
public void test1(){
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
TreeSet<Integer> ts = new TreeSet<>(comparator);
}
//Lambda表達式
@Test
public void test2(){
Comparator<Integer> comparator = (x ,y) -> Integer.compare(x, y);
TreeSet<Integer> ts = new TreeSet<>(comparator);
}
2. 用Lambda表達式優化代碼
- 需求1:獲取當前公司中員工年齡大於35的員工信息
-
需求2:獲取當前公司中員工工資大於5000的員工信息
public class Employee { private String name; private int age; private double salary; public Employee() { super(); } public Employee(String name, int age, double salary) { super(); this.name = name; this.age = age; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", age=" + age + ", salary=" + salary + '}'; } }
List<Employee> employees = Arrays.asList( new Employee("張三", 18 ,9999.99), new Employee("李四", 38, 5555.99), new Employee("王五", 50, 6666.66), new Employee("趙六", 16, 3333.33), new Employee("田七", 8, 7777.77) );
實現方式
@Test public void test3(){ //獲取年齡大於35歲的員工信息 List<Employee> employeeList = filterEmployee(employees); System.out.println("年齡大於35歲的員工信息:"); for (Employee employee : employeeList){ System.out.println(employee); } //獲取當前公司中員工工資大於5000的員工信息 List<Employee> employeeList1 = filterEmployees2(employees); System.out.println("工資大於5000的員工信息:"); for (Employee employee : employeeList1){ System.out.println(employee); } } 獲取當前公司中員工年齡大於35的員工信息 public List<Employee> filterEmployee(List<Employee> employeeList){ List<Employee> emps = new ArrayList<>(); for (Employee emp : employeeList){ if (emp.getAge() >= 35){ emps.add(emp); } } return emps; } 獲取當前公司中員工工資大於5000的員工信息 public List<Employee> filterEmployees2(List<Employee> employeeList){ ArrayList<Employee> employees = new ArrayList<>(); for (Employee employee : employeeList){ if (employee.getSalary() >= 5000){ employees.add(employee); } } return employees; }
優化方案一:策略設計模式
public interface MyPredicate<T> { public boolean test(T t); }
public class FilterEmployeeByAge implements MyPredicate<Employee>{ @Override public boolean test(Employee employee) { return employee.getAge() >= 35; } }
public class FilterEmployeeBySalary implements MyPredicate<Employee>{ @Override public boolean test(Employee employee) { return employee.getSalary() >= 5000; } }
@Test public void test4(){ List<Employee> employeeList = filterEmployee(employees, new FilterEmployeeByAge()); System.out.println("年齡大於35歲的員工信息:"); for (Employee employee : employeeList){ System.out.println(employee); } System.out.println("工資大於5000的員工信息:"); List<Employee> employeeList1 = filterEmployee(this.employees, new FilterEmployeeBySalary()); for (Employee employee : employeeList1){ System.out.println(employee); } } public List<Employee> filterEmployee(List<Employee> employeeList, MyPredicate<Employee> mp){ ArrayList<Employee> employees = new ArrayList<>(); for (Employee employee : employeeList){ if (mp.test(employee)){ employees.add(employee); } } return employees; }
優化方案二:匿名內部類
public interface MyPredicate<T> { public boolean test(T t); }
@Test public void test5(){ List<Employee> employeeList = filterEmployee(employees, new MyPredicate<Employee>() { @Override public boolean test(Employee employee) { return employee.getAge() >= 35; } }); System.out.println("年齡大於35歲的員工信息:"); for (Employee employee : employeeList){ System.out.println(employee); } List<Employee> employeeList1 = filterEmployee(employees, new MyPredicate<Employee>() { @Override public boolean test(Employee employee) { return employee.getSalary() >= 5000; } }); System.out.println("工資大於5000的員工信息:"); for (Employee employee : employeeList1){ System.out.println(employee); } }
優化方案三:Lambda表達式
public List<Employee> filterEmployee(List<Employee> employeeList, MyPredicate<Employee> mp){ ArrayList<Employee> employees = new ArrayList<>(); for (Employee employee : employeeList){ if (mp.test(employee)){ employees.add(employee); } } return employees; }
@Test public void test6(){ System.out.println("年齡大於35歲的員工信息:"); List<Employee> employeeList = filterEmployee(employees, (e) -> e.getAge() >= 35); employeeList.forEach(System.out::println); System.out.println("工資大於5000的員工信息:"); List<Employee> employeeList1 = filterEmployee(employees, (e) -> e.getSalary() >= 5000); employeeList1.forEach(System.out::println); }
優化方案四:Lambda表達式和Stream API
@Test public void test7(){ System.out.println("年齡大於35歲的員工信息:"); employees.stream() .filter((e) -> e.getAge() >= 35) .forEach(System.out::println); System.out.println("工資大於5000的員工信息:"); employees.stream() .filter((e) -> e.getSalary() >= 5000) .forEach(System.out::println); }