Java在1.8版本的时候,引入了Lambda表达式,Lambda表达式指的是应用在单一抽象方法接口环境下的一种简化定义形式,可以用于解决匿名内部类的定义复杂问题。
所以,先来研究匿名内部类是什么!
匿名内部类
- 没有名字的内部类
- 必须在抽象类或接口基础上才可以定义
匿名内部类的产生原因
public class Test {
public static void main(String[] args) {
fun(new MsgPrintImpl());
}
//接受接口的对象
public static void fun(MsgPrint msg) {
msg.print();
}
}
//定义一个信息输出的接口
interface MsgPrint{
public void print();
}
//实现接口
class MsgPrintImpl implements MsgPrint{
@Override
public void print() {
System.out.println("输出信息");
}
}
结果:
输出信息
很明显,一个简单的接口,在我们再主方法中使用之前,需要先实现它的方法,这样既麻烦又不方便
所以我们出现了匿名内部类的方式来解决这个问题
public class Test {
public static void main(String[] args) {
fun(new MsgPrint(){
@Override
public void print() {
System.out.println("输出信息");
}
});
}
public static void fun(MsgPrint msg) {
msg.print();
}
}
interface MsgPrint{
public void print();
}
结果:
输出信息
在这里,我们直接使用了匿名内部类,不需要去再去创建一个接口实现类,然后再拿来实例化对象,结果一样,只是把重写的方法拿到我们需要用的地方去操作。
虽然简单,但是在开发过程中,不一定好用,一般还是用实现接口类来,看起来更加直观。
重写的过程,观察两个代码比较,实际上是一样的,java为了简化代码量,让编程更加的便捷,引入了Lambda表达式。
Lambda表达式
匿名内部类的方式:
public class Test {
public static void main(String[] args) {
fun(new MsgPrint(){
@Override
public void print() {
System.out.println("输出信息");
}
});
}
public static void fun(MsgPrint msg) {
msg.print();
}
}
interface MsgPrint{
public void print();
}
Lambda方式:
public class Test {
public static void main(String[] args) {
fun(()->System.out.println("输出信息"));
}
public static void fun(MsgPrint msg) {
msg.print();
}
}
interface MsgPrint{
public void print();
}
两者比较,Lambda表达式,更加的方便快捷,不用重写方法,只需要将值传入进去就可以
分析原理
Lambda的语法:(参数)->方法体
fun(()->System.out.println(“输出信息”))中的()->System.out.println(“输出信息”)实际上可以这样理解
一般来说,Lambda中的 (参数) 我们都不会在内部设置值,因为接口都是用来别实现重写方法的。
Lambda中-> 后面的值,相当于重写了接口中的方法。
但是比实现类或者匿名内部类中更方便快捷。
定义多个抽象方法
只需要在接口上面加上@FunctionalInterface注解就可以(第一个是L,第二是i)
public class Test {
public static void main(String[] args) {
fun(()->{//这里的括号别忘了!当有多行语句的时候,必须加{}
System.out.println("输出信息");
System.out.println("输出信息1");
});
}
public static void fun(MsgPrint msg) {
msg.print();
}
}
@FunctionalInterface
interface MsgPrint{
public void print();
}
虽然Lambda表达式简单便捷,但是实际开发中并不常用,对java的基本结构会造成冲击,看起来也不美观,一般实现类更常用。