1.什么是Lambda表达式?(官方定义)
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
2.为什么使用Lambda表达式?
- Lambda可以避免匿名内部类定义过多
- 可以让代码看起来更加简介
- 去掉一堆没有意义的代码,只留下核心代码
3.使用Lambda表达式的前提
- 使用或创建的接口只包含唯一一个抽象方法,即函数式编程
- 例如 Runnable接口,此接口实现的唯一方法为run()
@Override
public void run() {
}
4.Lambda表达式的推导过程
这里定义一个接口MyInter
定义类my实现接口,类中包含唯一一个方法lambda()
-
普通调用
public class Lambda { public static void main(String[] args) { //3.普通调用 MyInter myInter = new my(); myInter.lambda(); } } //1.定义一个函数式接口 interface MyInter { void lambda(); } //2.实现类 class my implements MyInter { @Override public void lambda() { System.out.println("i like lambda!"); } }
-
静态内部类
public class Lambda { //2.静态内部类 static class my implements MyInter { @Override public void lambda() { System.out.println("i like lambda!"); } } public static void main(String[] args) { //3.静态内部类调用 my my = new my(); my.lambda(); } } //1.定义一个函数式接口 interface MyInter { void lambda(); }
-
局部内部类
public class Lambda { public static void main(String[] args) { //2.局部内部类 class my implements MyInter { @Override public void lambda() { System.out.println("i like lambda!"); } } //3.局部内部类调用 my my = new my(); my.lambda(); } } //1.定义一个函数式接口 interface MyInter { void lambda(); }
-
匿名内部类
public class Lambda { public static void main(String[] args) { //2.匿名内部类,没有类的名称,必须借助接口或者父类 MyInter myInter = new MyInter() { @Override public void lambda() { System.out.println("i like lambda!"); } }; //3.匿名内部类调用 myInter.lambda(); } } //1.定义一个函数式接口 interface MyInter { void lambda(); }
-
用Lambda表达式简化(jdk8以后可实现)
public class Lambda { public static void main(String[] args) { //2.用Lambda表达式简化(jdk8以后可实现) MyInter myInter = () -> { System.out.println("i like lambda!"); }; //3.Lambda表达式调用 myInter.lambda(); } } //1.定义一个函数式接口 interface MyInter { void lambda(); }
-
用Lambda表达式简化(jdk8以后可实现)
- 重新方法体中的语句只有一条时,可将花括号简化
public class Lambda { public static void main(String[] args) { //2.用Lambda表达式简化(jdk1.8以后可实现) MyInter myInter = () -> System.out.println("i like lambda!"); //3.Lambda表达式调用 myInter.lambda(); } } //1.定义一个函数式接口 interface MyInter { void lambda(); }
注意
只有当接口只有唯一的一个方法时,才可以使用Lambda表达式简化!!!