多线程
4 Lambda表达式
- λ是希腊字母表中排序第十一位的字母,英语名称为Lambda
- 是为了避免匿名内部类定义过多
- 实质属于函数式编程的概念
为什么要使用Lambda表达式?
- 避免匿名内部类定义过多
- 可以让代码看起来很简洁
- 去掉了一堆没有意义的代码,而只留下核心的逻辑
理解Functional Interface(函数式接口)是学习Java8 Lambda表达式的关键所在。
函数式接口的定义:
-
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
-
public interface Runnable {public abstract void run(); //接口中定义的方法默认隐式声明为抽象方法,故可以省略abstract }
-
对于函数式接口,可以通过Lambda表达式来创建该接口的对象
下面将用代码演示Lambda表达式的推导:
package com.duo.lambda;//演示:推导Lambda表达式
public class LambdaTest1 {//3.静态内部类static class Like2 implements ILike {@Overridepublic void lambda() {System.out.println("2: I like lambda");}}public static void main(String[] args) {ILike like = new Like(); //ILike:向上转型like.lambda();Like2 like2 = new Like2();like2.lambda();//4.局部内部类class Like3 implements ILike {@Overridepublic void lambda() {System.out.println("3: I like lambda");}}Like3 like3 = new Like3();like3.lambda();//5.匿名内部类:没有类的名称,必须借助接口或者父类like = new ILike() {@Overridepublic void lambda() {System.out.println("4: I like lambda");}};like.lambda();//6.用Lambda表达式简化like = () -> {System.out.println("5: I like lambda");};like.lambda();}}//1.先定义一个函数式接口
interface ILike {void lambda();
}//2.实现接口类
class Like implements ILike {@Overridepublic void lambda() {System.out.println("1: I like lambda");}
}
运行结果:
带有参数的Lambda表达式:
package com.duo.lambda;public class LambdaTest2 {public static void main(String[] args) {//Lambda表达式写法的简化ILove love = (int a) -> {System.out.println("1: I love you -> " + a);};love.lambda(2);}
}interface ILove {void lambda(int a);
}
运行结果:
此外,Lambda表达式还有一些更简化的写法,但用法比较受限,具体总结如下:
- Lambda表达式的代码体中,在只有一行代码的情况下,才能将整个Lambda表达式简化为一行;如果代码体有多行,就需要以代码块包裹
- 使用Lambda表达式前提:接口为函数式接口
- 当接口中的方法为多个参数时,Lambda表达式也可以去掉参数类型的声明