文章目录
1、为什么要使用Lambda
表达式
- 避免匿名内部类定义过多
- 可以让你的代码看起来很简洁
- 去掉了一堆没有意义的代码,只留下核心的逻辑。
2、函数式接口
理解
Functional lnterface
(函数式接口)是学习Java8 lambda
表达式的关键所在。
定义:任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
public interface Runnable {
public abstract void run();
}
直接以
Runnable
接口为例,它是不是只有一个抽象方法run
,那么它就是一个函数式接口,对于函数式接口,我们就可以通过Lambda表达式来创建该接口的对象。
3、Lambda表达式的推导
①、一般情况创建接口对象
Ⅰ、创建接口
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:43
* @projectName LambdaDemo
* @className Like.java
* @description TODO
*/
public interface Like {
public abstract void like();
}
Ⅱ、创建接口实现类
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:46
* @projectName LambdaDemo
* @className Ilike.java
* @description TODO
*/
public class ILike implements Like {
@Override
public void like() {
System.out.println("I like java!");
}
}
Ⅲ、Main方法测试
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:35
* @projectName LambdaDemo
* @className LambdaTest1.java
* @description TODO
*/
public class LambdaTest1 {
public static void main(String[] args) {
ILike iLike = new ILike();
iLike.like();
}
}
②、静态内部类方式创建接口对象
先创建接口类,再创建其实现类,最后再创建该实现类,这个步骤实在太多,为了少创建几个文件,直接使用静态内部类方式创建
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:35
* @projectName LambdaDemo
* @className LambdaTest1.java
* @description TODO
*/
public class LambdaTest1 {
static class ILike implements Like{
@Override
public void like() {
System.out.println("I like java!!");
}
}
public static void main(String[] args) {
ILike iLike = new ILike();
iLike.like();
}
}
③、局部内部类方式创建接口对象
这里的实现类
ILike
只在一个地方使用了一次,放在全局不大合适,再将其转移到内部定义
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:35
* @projectName LambdaDemo
* @className LambdaTest1.java
* @description TODO
*/
public class LambdaTest1 {
public static void main(String[] args) {
class ILike implements Like {
@Override
public void like() {
System.out.println("I like java!!!");
}
}
ILike iLike = new ILike();
iLike.like();
}
}
④、匿名内部类方式创建接口对象
继续优化,回想匿名内部类,没有类名称,直接借助接口我们就可以
new
出这个接口的实现类对象
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:35
* @projectName LambdaDemo
* @className LambdaTest1.java
* @description TODO
*/
public class LambdaTest1 {
public static void main(String[] args) {
Like like = new ILike() {
@Override
public void like() {
System.out.println("I like java!!!!");
}
};
like.like();
}
}
⑤、继续使用Lambda简化
它直接将接口中的方法声明给省略了,因为该接口中只有一个抽象方法,声明与否无关紧要
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:35
* @projectName LambdaDemo
* @className LambdaTest1.java
* @description TODO
*/
public class LambdaTest1 {
public static void main(String[] args) {
Like like = () -> {
System.out.println("I like java!!!!!");
};
like.like();
}
}
对于方法体中只有一个打印语句,前面的大括号都还可以省略,像这样,是不是特别简洁!但是前提是方法中只有一行语句,如果有多行,还是乖乖写大括号
Like like = () -> {
System.out.println("I like java!!!!!");
};
//转换为
Like like = () -> System.out.println("I like java!!!!!");
⑥、含参接口如何使用lambda
Ⅰ、简单修改一下Like接口
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:43
* @projectName LambdaDemo
* @className Like.java
* @description TODO
*/
public interface Like {
void like(int a);
}
Ⅱ、Lambda表达式
/**
* @author PengHuAnZhi
* @createTime 2021/2/14 20:35
* @projectName LambdaDemo
* @className LambdaTest1.java
* @description TODO
*/
public class LambdaTest1 {
public static void main(String[] args) {
Like like = a -> System.out.println("I like java " + a + " times!");
like.like(1);
}
}
注意这个地方我的新接口
Like
中的方法只有一个参数,所以在使用Lambda
表达式的时候,a
没有打括号,如果参数不止一个,括号需要加上,如:
Like like = a -> System.out.println("I like java " + a + " times!");
//变为
Like like = (a,b) -> System.out.println("I like java " + a + b + " times!");