逐步优化看出Java8的强大

来源:互联网 发布:canon mp288清零软件 编辑:程序博客网 时间:2024/05/22 17:58

1、Java8的核心是lambda编程和Stream API

下面通过一个例子讲明Java8的强大

2.类employee 包含{private String  name;   private int  age ;  private  double salary;}三个属性,构造器和get set方法省略

需求:a.输出年龄>35的员工信息     b.输出工资>5000的员工信息   c.输出工资<3000的员工信息

List<Employee> emps = Arrays.asList(new Employee(101, "张三", 18, 9999.99),new Employee(102, "李四", 59, 6666.66),new Employee(103, "王五", 28, 3333.33),new Employee(104, "赵六", 8, 7777.77),new Employee(105, "田七", 38, 5555.55));

(1)最长见的方法,写一个满足需求的方法,但是这种方式很冗余,当有新的需求加入时,必须重新修改程序

//需求:获取公司中年龄小于 35 的员工信息public List<Employee> filterEmployeeAge(List<Employee> emps){List<Employee> list = new ArrayList<>();for (Employee emp : emps) {if(emp.getAge() <= 35){list.add(emp);}}return list;}@Testpublic void test3(){List<Employee> list = filterEmployeeAge(emps);for (Employee employee : list) {System.out.println(employee);}}//需求:获取公司中工资大于 5000 的员工信息public List<Employee> filterEmployeeSalary(List<Employee> emps){List<Employee> list = new ArrayList<>();for (Employee emp : emps) {if(emp.getSalary() >= 5000){list.add(emp);}}return list;}
(2)优化方式:设计模式 策略

方式一如果新引入需求必须修改源码,所以可以采用策略设计模式:创建一个抽象主题 声明一个方法,根据需求创建具体主题实现抽象主题中的方法,只要调用具体类中的该方法即可。

缺点:每一种需求都要创建一个类,虽然不用改动原有代码,但是当需求多时类的数目多。

package com.atguigu.java8;@FunctionalInterfacepublic interface MyPredicate<T> {public boolean test(T t);}
public class FilterEmployeeForAge implements MyPredicate<Employee>{@Overridepublic boolean test(Employee t) {return t.getAge() <= 35;}}

package com.atguigu.java8;public class FilterEmployeeForSalary implements MyPredicate<Employee> {@Overridepublic boolean test(Employee t) {return t.getSalary() >= 5000;}}

//优化方式一:策略设计模式public List<Employee> filterEmployee(List<Employee> emps, MyPredicate<Employee> mp){List<Employee> list = new ArrayList<>();for (Employee employee : emps) {if(mp.test(employee)){list.add(employee);}}return list;}@Testpublic void test4(){List<Employee> list = filterEmployee(emps, new FilterEmployeeForAge());for (Employee employee : list) {System.out.println(employee);}System.out.println("------------------------------------------");List<Employee> list2 = filterEmployee(emps, new FilterEmployeeForSalary());for (Employee employee : list2) {System.out.println(employee);}}

(3)因为(2)的缺点,所以采用新的优化方式:匿名内部类

//优化方式二:匿名内部类@Testpublic void test5(){List<Employee> list = filterEmployee(emps, new MyPredicate<Employee>() {@Overridepublic boolean test(Employee t) {return t.getId() <= 103;}});for (Employee employee : list) {System.out.println(employee);}}

(4)为去除(3)的冗余,可采用lambda编程

public List<Employee> filterEmployee(List<Employee> emps, MyPredicte<Employee> mp){List<Employee> list = new ArrayList<>();for (Employee employee : emps) {if(mp.test(employee)){list.add(employee);}}return list;}public void test6(){List<Employee> list = filterEmployee(emps, (e) -> e.getAge() <= 35);list.forEach(System.out::println);System.out.println("------------------------------------------");List<Employee> list2 = filterEmployee(emps, (e) -> e.getSalary() >= 5000);list2.forEach(System.out::println);}

(5)Stream 流来操作

public void test7(){emps.stream().filter((e) -> e.getAge() <= 35).forEach(System.out::println);System.out.println("----------------------------------------------");emps.stream().map(Employee::getName).limit(3).sorted().forEach(System.out::println);}




0 0