2.2 Lambda 表达式
- λ 希腊字母表中 排名第十一,英文名称为 Lambda
- 避免匿名内部类定义过多 而诞生的表达式
- 本质上 属于 函数式编程的思想(Java 居然还引入了 函数式编程思想)
a -> System.out.println(“i like Lambda -->”+a);
new Thread(()->System.out.println(“多线程的学习!”)).start();
2.2.1 为什么要使用 Lambda
-
避免匿名内部类 定义过多
-
可以让你的代码看起来很简洁
-
去掉一堆没有意义的代码,只留下 核心的逻辑。
-
也许你会说,我看了 Lambda 表达式,不但不觉得简洁,反而觉得更乱,看不懂呀。那是因为 我们还没有习惯,用多了,看习惯了,就好了。
2.2.2 理解Lambda 表达式
- 理解 functional Interface(函数式接口)是学习 Java 8 lambda 表达式的关键所在。
- 函数式接口的定义:
任何接口,如果方法唯一一个,那么它 就是 一个 函数式的 接口!
- 对于函数式接口,我们 通过 lambda 表达式 来创建该 接口的对象并实现该接口的方法。
若想 用 lambda 表达式来 调用该接口,是不需要新建一个对象的(当然你也可以新建)。然后 对象 = ()->{实现的方法内容};这样我们 就能 实现 该 方法了,但是你还是得 调用 该方法。
不过用的最多的方式是:ILike l = () -> {
System.out.println(“hhe”);
};//直接 通过 lambda 表达式 来 新建 这个对象。
lambda 表达式 是为了 简化 匿名内部类 的 书写步骤。而实现匿名内部类。
package www.muquanyu.leeson02;
/*** 推导Lambda*/public class LambdaDemo {
//2. 实现类static class Like2 implements ILike{
@Overridepublic void lambda(){
System.out.println("I like lamada2");}}public static void main(String[] args) {
//向上转换ILike like = new Like();like.lambda();//比较傻逼的 lambda 写法,在新建 对象的时候居然 不直接 写 lambdalike = () -> {
System.out.println("我草你大爷");} ;like.lambda();
//新建 对象的时候,直接 写 lambda,然后 调用 方法即可(非常推荐这样写。)ILike l = () -> {
System.out.println("hhe");};l.lambda();}}//1. 首先我们要 定义 一个 函数式接口,什么意思呢,就是 只有 一个 方法
//那不就是 相当于 C/C++ 的 函数嘛。interface ILike{
void lambda();
}//2. 实现类
class Like implements ILike{
@Overridepublic void lambda(){
System.out.println("I like lamada");}
}
可能前面写的笔记没说过!interface 接口 这个东西,实际上 是可以 通过 匿名内部类 和 lambda 表达式 直接 创建 对象的!它 其实 就是 一个 特殊的 abstract 类。可以 有很多子类帮它 写方法。而它的方法 也都是 abstract 的。所以当然 它也可以 创建对象,创建的是 接口的对象。只是 比较费事,所以基本上 没什么人 创建 接口的对象!除非 接口的方法只有一个,那么就会 有人 用 lambda 表达式创建它!!
2.2.3 lambda () 和 {} 是什么 ?
- () 是写参数列表的
- {} 是方法内部的重写代码
- 举个例子
interface Love{
int lambda(int a);
}Love love = (int a) ->{
return a+10;};System.out.println(love.lambda(10));
而随着 lambda 表达式被大家所认可,而兴起。lambda 表达式 对于 参数() 、{} 甚至还进行了 相应的简化操作。
- 简化() ①
Love love1 = (a) ->{
return a+10;};System.out.println(love1.lambda(20));
在这里,我们 完全 忽略了 提供参数 的 类型,确实呀,我们的这个类型直接就可以找到的呀!在 interface 接口那里已经告诉你 参数类型是什么了。
- 简化() ②
Love love2 = a ->{
return a+10;};System.out.println(love2.lambda(30));
这里的简化,把 括号 () 去掉了。然后 我们 还是可以 正常操作的。
- 简化{} ①
ILike a = ()->System.out.println("只有一条语句的话,而且不是 return语句就可以简化 {}");a.lambda();
只要是一条语句,并且不是 return 语句 就可以这样写。可以把 {} 去掉。但 实用性不太强!
切记:如果要用 Lambda 表达式,必须保证 接口的 方法 是一个!如果 超过了一个,哪怕是两个 都用不了!!!