一、为什么使用 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   pony1223  阅读(391)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示