一、为什么使用 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新特性》学习

posted on 2018-09-06 22:23  pony1223  阅读(397)  评论(0)    收藏  举报

导航