多线程
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 {
@Override
public 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 {
@Override
public void lambda() {
System.out.println("3: I like lambda");
}
}
Like3 like3 = new Like3();
like3.lambda();
//5.匿名内部类:没有类的名称,必须借助接口或者父类
like = new ILike() {
@Override
public 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 {
@Override
public 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表达式也可以去掉参数类型的声明