一、为什么使用 Lambda 表达式
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
@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> treeSet = new TreeSet<>(comparator); } List<Employee> employees = Arrays.asList( new Employee("张小", 18, 1999.99), new Employee("李而", 19, 2999.99), new Employee("张三", 20, 3999.99), new Employee("张四", 21, 4999.99), new Employee("王五", 38, 5555.55), new Employee("赵六", 30, 6666.66), new Employee("田七", 50, 7777.77) ); //需求:获取当前公司中员工年龄大于35的员工信息 @Test public void test3() { List<Employee> list = filterEmployees(this.employees); for (Employee employee : list) { System.out.println(employee); } } public List<Employee> filterEmployees(List<Employee> list) { List<Employee> emps = new ArrayList<>(); for (Employee emp : list) { if (emp.getAge() >= 35) { emps.add(emp); } } return emps; } //需求:获取当前公司中员工工资大于5000的员工信息 public List<Employee> filterEmployees2(List<Employee> list) { List<Employee> emps = new ArrayList<>(); for (Employee emp : list) { if (emp.getSalary() >= 5000) { emps.add(emp); } } return emps; } //优化方式一:策略设计模式 @Test public void test4(){ List<Employee> list = filterEmployee(this.employees, new FilterEmployeeByAge()); for (Employee employee : list) { System.out.println(employee); } System.out.println("-----------------------------------"); List<Employee> list2 = filterEmployee(this.employees, new FilterEmployeeBySalary()); for (Employee employee : list2) { System.out.println(employee); } } public List<Employee> filterEmployee(List<Employee> list, MyPredicate<Employee> myPredicate) { List<Employee> emps = new ArrayList<>(); for (Employee employee:list) { if (myPredicate.test(employee)){ emps.add(employee); } } return emps; } //优化方式二:匿名内部类 @Test public void test5(){ List<Employee> list = filterEmployee(this.employees, new MyPredicate<Employee>() { @Override public boolean test(Employee employee) { return employee.getSalary() <= 5000; } }); for (Employee employee:list) { System.out.println(employee); } } //优化方式三:Lambda 表达式 @Test public void test6(){ List<Employee> list = filterEmployee(this.employees, (e) -> e.getSalary() <= 5000); list.forEach(System.out::println); } //优化方式四:只有数据 Stream API @Test public void test7(){ employees.stream() .filter((e)->e.getSalary()>=5000) .limit(2) .forEach(System.out::println); System.out.println("-----------------------------------"); employees.stream() .map(Employee::getName) .forEach(System.out::println); }
参考资料:
《尚硅谷_Java8新特性》学习
浙公网安备 33010602011771号