通常在刚学习Java不久的朋友们,通常还不知道Lambda表达式是什么东西,偶尔可能在某些地方看到一些奇奇怪怪的java语句,觉得很陌生,感觉不像Java的语法。没错,这就是Java语言中一种特殊的语法:Lambda语法
先请大家看看:
Lambda语法的省略规则
- 小括号内参数的类型可以省略;
- 如果小括号内有且仅有一个参,则小括号可以省略;
- 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
Lambda的使用前提
- 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。
- 使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
** 下面请看代码:**
我们在了解Lambda使用前提后,我们知道需要使用接口,我们首先来回顾接口的使用方法:
定义接口:
package com.test03;
/**
* 定义接口A
*/
public interface A {
void study();
}
接口使用方法一:
package com.test03;
/**
* 接口的使用方法一:外部类方法
*/
public class Demo01 {
public static void main(String[] args) {
//创建已经实现了A接口的类的对象
MyA myA = new MyA();
//使用对象中的方法
myA.study();
}
}
//在类外面创建一个新的类,实现A接口
class MyA implements A{
@Override
public void study() {
System.out.println("外部类实现了A接口");
}
}
运行结果:
接口使用方法二:
package com.test03;
/**
* 接口的使用方法二:内部类方法
*/
public class Demo02 {
public static void main(String[] args) {
//创建内部类实现A接口
class MyA implements A{
@Override
public void study() {
System.out.println("内部类实现了A接口");
}
}
//创建MyA对象
MyA myA = new MyA();
myA.study(); //使用对象的方法
}
}
运行结果:
接口使用方法三:
package com.test03;
/**
* 接口的使用方法三:匿名内部类方法
*/
public class Demo03 {
public static void main(String[] args) {
// 创建了一个已经实现了A接口里面方法的类并且实例化,但该对象没有名字
new A() {
@Override
public void study() {
System.out.println("匿名内部类实现类A接口");
}
}.study();
}
}
运行结果:
回顾完接口的使用方法后,我们来看看Lambda表达式是如何对接口进行简化语法的。下面分两种情况对Lambda表达式进行展示:
接口做方法参数的情况:
传统语法格式:
package com.test03;
/**
* 当接口作为方法的参数是,Lambda表达式的使用
*/
public class Demo04 {
public static void main(String[] args) {
// TODO 调用本类的方法
/**
* 由于调用方法是需要的是一个接口A类型的对象,但是接口还没被实现
* 下面为了方便,直接用匿名内部类的方法来实现A接口
*/
usingA(new A() {
@Override
public void study() {
System.out.println("接口A被实例化后,当做方法的参数啦");
}
});
}
//定义一个方法,这个方法的功能是调用A接口中的方法
public static void usingA(A a){
a.study();
}
}
使用Lambda表达式:
初步简化:
package com.test03;
/**
* 当接口作为方法的参数是,Lambda表达式的使用
*/
public class Demo05 {
public static void main(String[] args) {
usingA(() -> { System.out.println("接口A被实例化后,当做方法的参数啦"); });
}
//定义一个方法,这个方法的功能是调用A接口中的方法
public static void usingA(A a) {
a.study();
}
}
进一步简化:
package com.test03;
/**
* 当接口作为方法的参数是,Lambda表达式的使用
*/
public class Demo05 {
public static void main(String[] args) {
usingA(() -> System.out.println("接口A被实例化后,当做方法的参数啦"));
}
//定义一个方法,这个方法的功能是调用A接口中的方法
public static void usingA(A a) {
a.study();
}
}
PS : 简化的情况还有相当的多,就不逐一介绍,大家可以去看想想资料,这里只描述一些常用的情况
接口做局部变量的情况:
(略)
Lambda表达式之-方法引用
Lambda表达式的另外一种语法情况,是Lambda的语法的精简再精简,有一以下三种情况:
- 对象::方法名
- 类名::方法名
- 类名::new
使用举例:(略)