⚪ λ 希腊字母表中排序第十一位的字母, 英语名称为Lambda
⚪ 避免匿名内部类定义过多
⚪ 其实质属于函数式编程的概念
⚪ 也可称为闭包
⚪ Lambda允许把一个函数作为方法的参数(函数作为参数传递进方法中)。
Lambda是在jdk8之后出现的所以现在用到的还是比较多的, 需要学习
◽避免匿名内部类定义过多
◽可以使代码更加简洁紧凑
◽去掉了一堆没有意义的代码, 只留下核心的逻辑。
💬 也许你会说, 我看了Lambda表达式, 不但不觉得简洁, 反而觉得更乱了, 看不懂了. 那是因为我们还没有习惯, 用的多了, 看习惯了, 就好了。学习就是这样的一个过程
lambda 表达式的语法格式如下:
- (parameters) -> expression [表达式]
- 或
- (parameters) -> statement [语句]
- 或
- (parameters) -> { statements; }
a-> System.out.println("i like lambda-->"+a)
◻️ 理解Functional Interface (函数式接口) 是学习Java8 lambda表达式的关键所在。
◽任何接口, 如果只包含唯一一个抽象方法, 那么它就是一个函数式接口。
- public interface Runnable {
- public abstract void run(); //抽象方法
- }
◽对于函数式接口, 我们可以通过 Lambda表达式 来创建该接口的对象。
如果到这里某些小伙伴还是听不懂的话, 没关系, 我们上代码推动着你讲解一下你就懂了:
1. 首先需要定义一个函数式接口
2. 实现接口的方法 → 一步一步简化方式实现
3. 创建接口对象 接口调用实现类
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 10:52
- * @Description: TODO: 推导 Lambda表达式
- * @Version: 1.0
- */
- public class TestLambda {
- // 3. 静态内部类
- static class Like2 implements ILike{
- @Override
- public void lambda() {
- System.out.println("i like lambda2");
- }
- }
-
- // 3. main
- public static void main(String[] args) {
- // 3. 创建接口对象 接口调用实现类
- ILike like = new Like();
- like.lambda();
-
- like = new Like2();
- like.lambda();
-
-
- // 4. 局部内部类
-
- class Like3 implements ILike {
- @Override
- public void lambda() {
- System.out.println("i like lambda3");
- }
- }
-
- like = new Like3();
- like.lambda();
-
- // 5. 匿名内部类, 没有类的名称,必须借助接口或者父类
- like = new Like() {
- @Override
- public void lambda() {
- System.out.println("i like lambda4");
- }
- };
- like.lambda();
-
- // 6. 用Lambda简化 Lambda是在jdk8之后出现的所以现在用到的还是比较多的, 需要学习
- like = ()-> {
- System.out.println("i like lambda5");
- };
- like.lambda();
- }
- }
-
- //1. 首先需要定义一个函数式接口
- interface ILike {
- void lambda();
- }
-
- //2. 实现类, 实现lambda方法
- class Like implements ILike {
- @Override
- public void lambda() {
- System.out.println("i like lambda");
- }
- }
如果你还是不理解那我们再来写一个例子
我们可以看到我们以上代码定义的函数式接口是没有参数的, 那我们来写一个不同的例子, 带参数的函数式接口.
这次我们一个方式一个方式的写, 看着不会太乱, 更好理解
这里我们定义了一个int类型的参数
1. 定义一个带参数的函数接口
2. 实现接口方法
3. 创建接口对象 接口调用实现类
4. 传递参数
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 12:11
- * @Description: TODO
- * @Version: 1.0
- */
- public class TestLambda2 {
-
- public static void main(String[] args) {
- // 创建接口对象
- ILove love = new Love();
- // 传递参数
- love.love(2);
- }
- }
-
- // 1. 定义一个带参数的函数式接口
- interface ILove {
- void love(int a); //定义一个int类型的参数
- }
-
- //2. 实现类
- class Love implements ILove {
- @Override
- public void love(int a) {
- System.out.println("i love you--->" + a);
- }
- }
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 12:11
- * @Description: TODO
- * @Version: 1.0
- */
- public class TestLambda2 {
-
- //2. 静态实现类
- static class Love implements ILove {
- @Override
- public void love(int a) {
- System.out.println("i love you--->" + a);
- }
-
- public static void main(String[] args) {
- // 实现love接口
- ILove love = new Love();
- // 传递参数
- love.love(2);
- }
- }
- }
-
-
- // 1. 定义一个带参数的函数式接口
- interface ILove {
- void love(int a); //定义一个int类型的参数
- }
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 12:11
- * @Description: TODO
- * @Version: 1.0
- */
- public class TestLambda2 {
-
- public static void main(String[] args) {
- //2. 局部内部类
- class Love implements ILove {
- @Override
- public void love(int a) {
- System.out.println("i love you--->" + a);
- }
- }
- // 实现love接口
- ILove love = new Love();
- // 传递参数
- love.love(2);
- }
- }
-
-
- // 1. 定义一个带参数的函数式接口
- interface ILove {
- void love(int a); //定义一个int类型的参数
- }
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 12:11
- * @Description: TODO
- * @Version: 1.0
- */
- public class TestLambda2 {
-
- public static void main(String[] args) {
- // 实现love接口
- // 匿名内部类
- ILove love = new ILove(){
- @Override
- public void love(int a) {
-
- }
- };
- // 传递参数
- love.love(2);
- }
- }
-
-
- // 1. 定义一个带参数的函数式接口
- interface ILove {
- void love(int a); //定义一个int类型的参数
- }
匿名内部实现类推导再简化, 就是我们的Lambda表达式.
如下图:
基于匿名内部类代码小编圈起来的代码都不用要了直接删掉!
参数: int a;
主体: System.out.println()
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 12:11
- * @Description: TODO
- * @Version: 1.0
- */
- public class TestLambda2 {
-
- public static void main(String[] args) {
- // 实现love接口
- // lambda表达式实现
- ILove love = (int a)-> {
- System.out.println("i love lambda表达式");
- };
- // 传递参数
- love.love(2);
- }
- }
-
-
- // 1. 定义一个带参数的函数式接口
- interface ILove {
- void love(int a); //定义一个int类型的参数
- }
那有些小伙伴就要问了:
💬 :既然可以简化这么多, 我们还能不能对它再简化呢?
👩💻:没问题
而且小编给大家扩充一下, Lambda表达式可以实现3种简化.但是也有条件的
1. 简化掉参数类型
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 12:11
- * @Description: TODO
- * @Version: 1.0
- */
- public class TestLambda2 {
-
- public static void main(String[] args) {
- // 实现love接口
- ILove love=null;
- // lambda表达式实现
- love = (int a)-> {
- System.out.println("i love lambda表达式");
- };
-
- // Lambda表达式简化 1, 参数类型
- love = (a)-> {
- System.out.println("i love lambda表达式");
- };
-
- // 传递参数
- love.love(2);
- }
- }
-
-
- // 1. 定义一个带参数的函数式接口
- interface ILove {
- void love(int a); //定义一个int类型的参数
- }
2. 简化掉参数类型+括号
前提:
只有一个参数的情况下才可以去掉括号, 多个参数会报错. 加上括号即可
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 12:11
- * @Description: TODO
- * @Version: 1.0
- */
- public class TestLambda2 {
-
- public static void main(String[] args) {
- // 实现love接口
- ILove love=null;
- // lambda表达式实现
- love = (int a)-> {
- System.out.println("i love lambda表达式");
- };
-
- // Lambda表达式简化 1, 参数类型
- love = (a)-> {
- System.out.println("i love lambda表达式");
- };
-
- // Lambda表达式简化 2, 简化括号
- love = a-> {
- System.out.println("i love lambda表达式");
- };
-
- // 传递参数
- love.love(2);
- }
- }
-
-
- // 1. 定义一个带参数的函数式接口
- interface ILove {
- void love(int a); //定义一个int类型的参数
- }
2. 简化掉参数类型+括号+花括号
前提:
只有一行代码的情况下
多个参数不能使用, 会报错 多个参数需要加上括号
- package cn.lambda;
-
- /**
- * @BelongsProject: staticthread
- * @BelongsPackage: cn.lambda
- * @Author: Jean_z
- * @CreateTime: 2024-05-14 12:11
- * @Description: TODO
- * @Version: 1.0
- */
- public class TestLambda2 {
-
- public static void main(String[] args) {
- // 实现love接口
- ILove love=null;
- // lambda表达式实现
- love = (int a)-> {
- System.out.println("i love lambda表达式");
- };
-
- // Lambda表达式简化 1, 参数类型
- love = (a)-> {
- System.out.println("i love lambda表达式");
- };
-
- // Lambda表达式简化 2, 简化括号
- love = a-> {
- System.out.println("i love lambda表达式");
- };
-
- // Lambda表达式简化 3, 简化花括号
- love = a-> System.out.println("i love lambda表达式" + a);
-
- // 传递参数
- love.love(2);
- }
- }
-
-
- // 1. 定义一个带参数的函数式接口
- interface ILove {
- void love(int a); //定义一个int类型的参数
- }
lambda表达式只能有一行代码的情况下才能简化成为一行, 如果有多行, 那就么就用代码块包裹.
前提是接口为函数时接口.
多个参数也可以去掉参数类型, 要去掉就全去掉, 必须加括号