⚪ λ 希腊字母表中排序第十一位的字母, 英语名称为Lambda
⚪ 避免匿名内部类定义过多
⚪ 其实质属于函数式编程的概念
⚪ 也可称为闭包
⚪ Lambda允许把一个函数作为方法的参数(函数作为参数传递进方法中)。
Lambda是在jdk8之后出现的所以现在用到的还是比较多的, 需要学习
◻️ 为什么要使用Lambda表达式
◽避免匿名内部类定义过多
◽可以使代码更加简洁紧凑
◽去掉了一堆没有意义的代码, 只留下核心的逻辑。
💬 也许你会说, 我看了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表达式 来创建该接口的对象。
如果到这里某些小伙伴还是听不懂的话, 没关系, 我们上代码推动着你讲解一下你就懂了:
Lambda表达式推导
1. 首先需要定义一个函数式接口
2. 实现接口的方法 → 一步一步简化方式实现
- 第一个实现方法 :创建实现类, 实现
- 第二个实现方法 :静态内部类, 实现
- 第三个实现方法 :局部内部类, 实现
- 第四个实现方法 :匿名内部类, 实现
- 第五个实现方法 :Lambda表达式, 实现
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{@Overridepublic void lambda() {System.out.println("i like lambda2");}
}// 3. mainpublic static void main(String[] args) {
// 3. 创建接口对象 接口调用实现类ILike like = new Like();like.lambda();like = new Like2();like.lambda();// 4. 局部内部类class Like3 implements ILike {@Overridepublic void lambda() {System.out.println("i like lambda3");}}like = new Like3();like.lambda();// 5. 匿名内部类, 没有类的名称,必须借助接口或者父类like = new Like() {@Overridepublic 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 {@Overridepublic void lambda() {System.out.println("i like lambda");}
}
如果你还是不理解那我们再来写一个例子
我们可以看到我们以上代码定义的函数式接口是没有参数的, 那我们来写一个不同的例子, 带参数的函数式接口.
这次我们一个方式一个方式的写, 看着不会太乱, 更好理解
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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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(){@Overridepublic void love(int a) {}};
// 传递参数love.love(2);}}// 1. 定义一个带参数的函数式接口
interface ILove {void love(int a); //定义一个int类型的参数
}
匿名内部实现类推导再简化, 就是我们的Lambda表达式.
-
第五个实现方法 :Lambda表达式, 实现
如下图:
基于匿名内部类代码小编圈起来的代码都不用要了直接删掉!
- 只留下我们的参数和主体 就是我们的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种简化.但是也有条件的
简化 Lambda表达式
-
简化方式一:
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表达式只能有一行代码的情况下才能简化成为一行, 如果有多行, 那就么就用代码块包裹.
前提是接口为函数时接口.
多个参数也可以去掉参数类型, 要去掉就全去掉, 必须加括号