一、为什么使用 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新特性》学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端