目录:
1、什么是Lambda表达式
lambda表达式:
它是JDK8的新特性之一,JDK8这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性。在本文中我们将学习lambda表达式。
为什么要使用lambda表达式?
1、避免匿名内部类定义过多
2、可以让你的代码看起来很简洁
3、去掉了一堆没有意义的代码,只留下核心的逻辑
也许你会说,我看了Lambda表达式,不但不觉得简洁,反而觉得更乱,看不懂了。那是因为我们还没有习惯,用的多了,看习惯了,就好了。
2、 函数式接口
函数式接口:任何接口,如果只包含一个抽象方法,那么他就是函数式接口。对于函数式接口,我们可以通过lambda表达式来创建该接口的对象。
3、Lambda表达式的推导
我将从静态内部类,局部内部类,匿名内部类,一步步简化推导出lambda表达式的由来,它与其他方法对比,更能看出它的优点。
package com.yuan;
/**
* @description:
* @author: ManolinCoder
* @time: 2022/3/3
*/
public class Test1 {
public static void main(String[] args) {
IStudy iStudy = new Study();
iStudy.lambda();
}
}
//定义一个函数式接口
interface IStudy{
void lambda();
}
//实现类
class Study implements IStudy{
@Override
public void lambda() {
System.out.println("我爱学习lambda");
}
}
以上是我们平时通过实现接口,创建对象,然后调用方法的例子
3.2.1用静态内部类简化
因为上面例子实现类在外部,这时就想如果把实现类放在类的内部则会方便许多。于是就有了静态内部类:在类的内部定义实现类,class关键字前面加上static
package com.yuan;
/**
* @description:
* @author: ManolinCoder
* @time: 2022/3/3
*/
public class Test1 {
static class Study implements IStudy{
@Override
public void lambda() {
System.out.println("我爱学习lambda");
}
}
public static void main(String[] args) {
IStudy iStudy = new Study();
iStudy.lambda();
}
}
//定义一个函数式接口
interface IStudy{
void lambda();
}
3.2.2用局部内部类简化
上面的例子我们也可以把实现类放在main方法里面,如下代码:
package com.yuan;
/**
* @description:
* @author: ManolinCoder
* @time: 2022/3/3
*/
public class Test1 {
public static void main(String[] args) {
//局部内部类
class Study implements IStudy{
@Override
public void lambda() {
System.out.println("我爱学习lambda");
}
}
IStudy iStudy = new Study();
iStudy.lambda();
}
}
//定义一个函数式接口
interface IStudy{
void lambda();
}
3.2.3 用匿名内部类简化
匿名内部类:没有类的名称,必须借助接口或者父类,代码和实现格式如下:记着后面的分号
package com.yuan;
/**
* @description:
* @author: ManolinCoder
* @time: 2022/3/3
*/
public class Test1 {
public static void main(String[] args) {
IStudy study = new IStudy() {
@Override
public void lambda() {
System.out.println("我爱学习lambda");
}
};
study.lambda();
}
}
//定义一个函数式接口
interface IStudy{
void lambda();
}
3.2.4 用lambda简化(进入正题)
下面代码充分地解释了lambda表达式的使用格式,可以看出代码量真的少了很多。
package com.yuan;
/**
* @description:
* @author: ManolinCoder
* @time: 2022/3/3
*/
public class Test1 {
public static void main(String[] args) {
IStudy study = ()->{
System.out.println("我爱学习lambda");
};
study.lambda();
}
}
//定义一个函数式接口
interface IStudy{
void lambda();
}
小结:
从以上代码可以看出在想要实现接口,调用接口内方法的过程中,无论是原始方法,或者是用静态内部类、局部内部类、匿名内部类时,其核心带式就是:
而相比之下lambda表达式就显得非常简洁:
IStudy study = ()->{
System.out.println("我爱学习lambda");
};
也可以简化成一行:
IStudy study = ()-> System.out.println("我爱学习lambda");
注意:lambda表达式只能有一行代码的情况下才能简化成一行,如有多行,那么就用代码块(大括号)包裹。