package com.lm; public class Employee { public Employee(String name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; } private String name; private int age; 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; } private double salary; @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", age=" + age + ", salary=" + salary + '}'; } }
未使用lambda前,这时如果经常性的增加需求,就得不停加方法
package com.lm; import org.junit.Test; import org.omg.Messaging.SyncScopeHelper; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestLambda2 { List<Employee> employees = Arrays.asList( new Employee("张三",18,9999), new Employee("李四",58,8888), new Employee("王五",48,7777), new Employee("赵六",38,6666), new Employee("田七",28,5555) ); @Test public void test(){ List<Employee> list = findEmployees2(employees); for (Employee employee : list) { System.out.println(employee.toString()); } } //得到员工大于35岁的 public List<Employee> findEmployees(List<Employee> list){ List<Employee> employeeList = new ArrayList<>(); for (Employee employee : employees) { if (employee.getAge() >=35){ employeeList.add(employee); } } return employeeList; } //得到员工工资大于8000的 public List<Employee> findEmployees2(List<Employee> list){ List<Employee> employeeList = new ArrayList<>(); for (Employee employee : employees) { if (employee.getSalary() >=8000){ employeeList.add(employee); } } return employeeList; } }
按年龄的策略
按工资的策略
package com.lm; //接口泛型 public interface MyPredicate<T> { //传对象判断实现 public boolean test(T t); }
实现接口
package com.lm; public class FilteEmployeeByAge implements MyPredicate<Employee> { //如果大于35返回真 @Override public boolean test(Employee t) { return t.getAge() >= 35; } }传实现的实例 FilteEmployeeByAge
package com.lm; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestLambda3 { List<Employee> employees = Arrays.asList( new Employee("张三",18,9999), new Employee("李四",58,8888), new Employee("王五",48,7777), new Employee("赵六",38,6666), new Employee("田七",28,5555) ); @Test public void test(){ List<Employee> list = findEmployees4(employees,new FilteEmployeeByAge()); for (Employee employee : list) { System.out.println(employee.toString()); } } // 优化一 //得到员工大于35岁的 public List<Employee> findEmployees4(List<Employee> list,MyPredicate<Employee> mp){ List<Employee> employeeList = new ArrayList<>(); for (Employee employee : employees) { if (mp.test(employee)){ employeeList.add(employee); } } return employeeList; } }如果想按工资过滤,这时就只要再加一个工资过滤的实现就好了
package com.lm; public class FilteEmployeeBySalary implements MyPredicate<Employee> { //如果大于35返回真 @Override public boolean test(Employee t) { return t.getSalary() >= 5000; } } @Test public void test(){ //按年龄过滤 List<Employee> list = findEmployees4(employees,new FilteEmployeeByAge()); for (Employee employee : list) { System.out.println(employee.toString()); } System.out.println("------------------------------------"); //按工资过滤 List<Employee> list2 = findEmployees4(employees,new FilteEmployeeBySalary()); for (Employee employee : list2) { System.out.println(employee.toString()); } }
因为上面的方式,每次实现一个方法都要用一个类来现实,用匿名内部类直接实现接口
package com.lm; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestLambda4 { List<Employee> employees = Arrays.asList( new Employee("张三",18,9999), new Employee("李四",58,8888), new Employee("王五",48,7777), new Employee("赵六",38,6666), new Employee("田七",28,5555) ); //优化方式二:匿名内部类 @Test public void test5(){ List<Employee> list = findEmployees(employees , new MyPredicate<Employee>() { @Override public boolean test(Employee t) { return t.getAge() >= 35; } }); for (Employee employee : list) { System.out.println(employee.toString()); } } public List<Employee> findEmployees(List<Employee> list,MyPredicate<Employee> mp){ List<Employee> employeeList = new ArrayList<>(); for (Employee employee : employees) { if (mp.test(employee)){ employeeList.add(employee); } } return employeeList; } }
上面匿名内部类,代码量大,可读性也不强
//优化方式二:Lambda表达式 @Test public void test6(){ List<Employee> list = findEmployees(employees , (e) -> e.getAge() >=35); list.forEach(System.out::println); } public List<Employee> findEmployees(List<Employee> list,MyPredicate<Employee> mp){ List<Employee> employeeList = new ArrayList<>(); for (Employee employee : employees) { if (mp.test(employee)){ employeeList.add(employee); } } return employeeList; }
此时只用到类,没借用上面的接口
package com.lm; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestLambda6 { List<Employee> employees = Arrays.asList( new Employee("张三",18,9999), new Employee("李四",58,8888), new Employee("王五",48,7777), new Employee("赵六",78,6666), new Employee("田七",28,5555) ); //优化方式四:Lambda表达式 @Test public void test6(){ employees.stream().filter((e) -> e.getAge() >= 35) .limit(2)//前2个 .forEach(System.out:: println); System.out.println("----------------------------"); employees.stream() .map(Employee::getName) //取名字 .forEach(System.out::println); } }