一、作用:
Lambda表达式是JDK1.8重要特性之一,其作用是可以减少匿名内部类的使用,使代码更加简洁。
二、使用限制
并不是所有的接口都可以用Lambda表达式,要求接口必须是函数式接口,即接口有且只能有一个抽象方法,但是可以有多个非抽象方法。
JDK 1.8 之前已有的函数式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
JDK 1.8 新增加的函数接口:
- java.util.function
三、多种类的书写方式与Lambda表达式进行比较
1.外部类
public class LamdaDemo {
public static void main(String[] args) {
Ilove ilove = new Love();
ilove.lambda(520);
}
}
//定义接口
interface Ilove{
void lambda(int a);
}
//1.外部类
class Love implements Ilove {
@Override
public void lambda(int a) {
System.out.println("I love you " + a);
}
}
2.静态内部类
public class LamdaDemo {
//2.静态内部类
static class Love implements Ilove {
@Override
public void lambda(int a) {
System.out.println("I love you " + a);
}
}
public static void main(String[] args) {
Ilove ilove = new Love();
ilove.lambda(520);
}
}
//定义接口
interface Ilove{
void lambda(int a);
}
3.局部内部类
public class LamdaDemo {
public static void main(String[] args) {
//3.局部内部类
class Love implements Ilove {
@Override
public void lambda(int a) {
System.out.println("I love you " + a);
}
}
Ilove ilove = new Love();
ilove.lambda(520);
}
}
//定义接口
interface Ilove{
void lambda(int a);
}
4.匿名内部类
public class LamdaDemo {
public static void main(String[] args) {
//4.匿名内部类,没有类的名称,必须借助接口或父类实现
Ilove ilove = new Ilove() {
@Override
public void lambda(int a) {
System.out.println("I love you " + a);
}
};
ilove.lambda(520);
}
}
//定义接口
interface Ilove{
void lambda(int a);
}
5.Lambda表达式
public class LamdaDemo {
public static void main(String[] args) {
//5.Lambda表达式
Ilove love = (int a) ->{
System.out.println("I love you " + a);
};
love.lambda(520);
}
}
//定义接口
interface Ilove{
void lambda(int a);
}
四、Lambda表达式简化
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
public static void main(String[] args) {
Ilove love = (a) ->{
System.out.println("I love you " + a);
};
love.lambda(520);
}
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
public static void main(String[] args) {
Ilove love = a ->{
System.out.println("I love you " + a);
};
love.lambda(520);
}
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
public static void main(String[] args) {
Ilove love = a -> System.out.println("I love you " + a);
love.lambda(520);
}
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。