JAVA Lambda表达式
1. Lambda表达式
1.1 体验Lambda表达式
函数式编程思想概述:
函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”
而我们要学习的Lambda表达式就是函数式思想的体现
1 /* 2 案例需求 3 启动一个线程,在控制台输出一句话:多线程程序启动了 4 */ 5 public class myLambda { 6 public static void main(String[] args) { 7 /* 实现方式一: 8 1.定义一个类MyRunnable实现Runnable接口,重写run()方法 9 2.创建MyRunnable类的对象 10 3.创建Thread类的对象,把MyRunnable的对象作为构造参数传递 11 4.启动线 12 */ 13 //创建MyRunnable对象 14 MyRunnable mr = new MyRunnable(); 15 16 //创建多线程对象,把Runnable的实现类对象mr传进去,并启动线程 17 new Thread(mr).start(); 18 19 20 //实现方式二: 21 //匿名内部类的方式改进 22 new Thread(new Runnable() { 23 @Override 24 public void run() { 25 System.out.println("多线程程序启动了"); 26 } 27 }).start(); 28 29 30 //实现方式三: 31 //Lambda表达式的方式改进 32 new Thread(()->{ 33 System.out.println("多线程程序启动了"); 34 }).start(); 35 } 36 }
1 Runnable的实现类对象: 2 public class MyRunnable implements Runnable{//继承Runnable接口 3 //重写run方法 4 @Override 5 public void run() { 6 System.out.println("多线程程序启动了"); 7 } 8 }
1.2 Lambda表达式的标准格式
1 格式: 2 3 (形式参数) -> {代码块}
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
->:由英文中画线和大于符号组成,固定写法。代表指向动作
代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
组成Lambda表达式的三要素:形式参数,箭头,代码块
1.3 Lambda表达式练习
Lambda表达式的使用前提
(1)有一个接口
(2)接口中有且仅有一个抽象方法
练习描述:
无参无返回值抽象方法的练习
操作步骤:
(1)定义一个接口(Eatable),里面定义一个抽象方法:void eat();
(2)定义一个测试类(EatableDemo),在测试类中提供两个方法:
一个方法是:useEatable(Eatable e)
一个方法是主方法,在主方法中调用useEatable方法
接口:
1 public interface Eatable { 2 void eat(); 3 }
接口实现类对象:
1 public class EatableImpl implements Eatable{ 2 @Override 3 public void eat() { 4 System.out.println("吃苹果了!"); 5 } 6 }
测试类:
1 public class EatableDemo { 2 public static void main(String[] args) { 3 4 //方式一:创建接口实现类对象,并把这个接口实现类对象传到useEatable()的参数里 5 EatableImpl eai = new EatableImpl(); 6 useEatable(eai); 7 8 //方式二:匿名内部类 9 useEatable(new Eatable() { 10 @Override 11 public void eat() { 12 System.out.println("吃苹果了!"); 13 } 14 }); 15 16 17 //方式三:Lambda表达式 18 useEatable(()->{ 19 System.out.println("吃苹果了!"); 20 } ); 21 } 22 23 24 private static void useEatable(Eatable e) { 25 e.eat(); 26 } 27 }
1.4 Lambda表达式练习2
练习描述:
有参无返回值抽象方法的练习
操作步骤:
定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s);
定义一个测试类(FlyableDemo),在测试类中提供两个方法
一个方法是:useFlyable(Flyable f)
一个方法是主方法,在主方法中调用useFlyable方法
接口:
1 接口: 2 public interface Flyable { 3 void fly(String s); 4 }
测试类:
1 public class FlyableDemo { 2 public static void main(String[] args) { 3 //方式一:匿名内部类 4 useFlyable(new Flyable() { 5 @Override 6 public void fly(String s) { 7 System.out.println(s); 8 System.out.println("一个筋斗十万八千里"); 9 } 10 }); 11 12 13 System.out.println("--------"); 14 15 16 //方式二:Lambda表达式 17 useFlyable((String s)->{ 18 System.out.println(s); 19 System.out.println("一个筋斗十万八千里"); 20 }); 21 } 22 23 private static void useFlyable(Flyable f) { 24 f.fly("风和日丽"); 25 } 26 27 }
1.5 Lambda表达式练习3
练习描述:
有参有返回值抽象方法的练习
操作步骤:
定义一个接口(Addable),里面定义一个抽象方法:int add(int x,int y);
定义一个测试类(AddableDemo),在测试类中提供两个方法:
一个方法是:useAddable(Addable a)
一个方法是主方法,在主方法中调用useAddable方法
接口:
1 public interface Addable { 2 int add(int x,int y); 3 }
测试类:
1 测试类: 2 public class AddableDemo { 3 public static void main(String[] args) { 4 5 //匿名内部类: 6 useAddable(new Addable() { 7 @Override 8 public int add(int x, int y) { 9 return x+y; 10 } 11 }); 12 13 System.out.println("--------"); 14 15 //Lambda表达式: 16 useAddable((int x,int y)->{ 17 return x+y; 18 }); 19 } 20 21 private static void useAddable(Addable a) { 22 int sum = a.add(10, 20); 23 System.out.println("和为:"+sum); 24 } 25 }
1.6 Lambda表达式的省略模式
省略的规则:
-
- 参数类型可以省略。但是有多个参数的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号,和return关键字
接口1:
1 public interface Flyable { 2 void fly(String s); 3 }
接口2:
1 public interface Addable { 2 int add(int x,int y); 3 }
测试类:
1 public class LambdaDemo { 2 public static void main(String[] args) { 3 //参数类型可以省略,只有一条语句时省略大括号和语句后面的分号,如果有return,return也要省略掉 4 //如果参数有且仅有一个,那么小括号可以省略 5 useFlyable((s ->System.out.println(s))); 6 7 System.out.println("---------"); 8 9 useAddable((x,y)->x+y); 10 } 11 12 private static void useAddable(Addable a) { 13 int sum = a.add(10, 20); 14 System.out.println("两数之和为:"+sum); 15 } 16 17 private static void useFlyable(Flyable f) { 18 f.fly("风和日丽,晴空万里"); 19 } 20 }
1.7 Lambda表达式的注意事项
(1)使用Lambda必须要有接口(抽象类、具体类都不行),并且要求接口中有且仅有一个抽象方法
(2)必须有上下文环境,才能推导出Lambda对应的接口
根据局部变量的赋值得知Lambda对应的接口
1 Runnable r = () -> System.out.println("Lambda表达式");
根据调用方法的参数得知Lambda对应的接口
1 new Thread(() -> System.out.println("Lambda表达式")).start();
1.8 Lambda表达式和匿名内部类的区别
所需类型不同:
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
使用限制不同:
如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
实现原理不同:
匿名内部类:编译之后,产生一个单独的.class字节码文件
Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了