lambda表达式
前言
在之前的文章中语法糖中介绍了java每个版本中的一些优化,但是没有把lambda加到当中,因为我觉得lambda表达式是一个重难点,也是面试中的一个考点。
还有平时我们在看一些项目的时候也会看到lambda表达式的出现,但是却不知道如何去解读,那么今天我就单独出一篇博客来说清楚,大家坐好发车了~~~
注意:lambda的版本是JDK8,小伙伴们在使用的时候一定要看清楚版本号啊。
一、lambda的导读
lambda是什么?
Lambda在希腊中是第十一位字母,但在java中他却是编程语言中函数的意思,是一个匿名函数,即没有函数名的函数(具体是怎么来的呢?在下面我在lambda的衍化中会详细解释道)其实它的本质其实还是java中的一颗语法糖。
我们为什么要用lambda表达式?
其实它的优点我感觉吧只有一点,那就是使代码更加简洁了,节省了开发时间看起来比较厉害点吧。。。
那它的缺点呢?
- 就是造成了代码的可读性变差了,代码简洁了,但是也比较难懂了。
- 不便于维护,加大了维护成本。
- 还有就是因为它出现的版本较迟,可能会有一些不稳定的因数存在。
在学习lambda表达式之前先让我们看一种接口类型
函数式接口(@functionInterface)
在学习lambda之前我们要知道先了解一个概念:函数式接口
那么它是这么定义的呢?
即指在定义了一个抽象的接口中的方法有且只有一个的时候
那么让我们看下面的一段案例让我们可以更加深刻的理解
public interface test {
void test();
default void test1() {} //默认实现
static void test2() {} //静态方法本身不用去重写
String toString(); //Object实现
}
在上述的接口中方法涵盖了我们可能会误导我们,他看起来像是有四个方法,但是实际上只有一个方法,所以它仍让是一个函数式接口。
我已经在上述的注释中详细说明了一些方法
如果实在分辨不出来函数式接口,那么可以在接口上方使用
注解来帮助我们判断这个接口是否是函数式接口。
二、lambda的衍变
首先让我们回忆一下实现接口的过程中
首先我们在这里定义一个接口
//这里我们添加FunctionalInterface进行判断
@FunctionalInterface
interface interfaceLambda {
void methodLambda();
}
通过继承实现
定义一个接口,一个抽象类继承,最后通过类实现
下面我们定义一个外部类
//定义实现类
class abstractLambda implements interfaceLambda {
@Override
public void methodLambda() {
System.out.println("通过外部类实现接口");
}
}
最后实例化进行实现
public class classLambda extends abstractLambda {
public static void main(String[] args) {
// 实现
abstractLambda i = new abstractLambda();
i.methodLambda();
}
}
通过上面的代码我们虽然实现了接口,但是过程繁琐,代码冗余,下面让我们继续使用另外一种实现方式
成员外部类
public class classLambda {
public static void main(String[] args) {
// 实现
abstractLambda i = new abstractLambda();
i.methodLambda();
}
static class abstractLambda implements interfaceLambda {
@Override
public void methodLambda() {
System.out.println("通过成员外部类实现接口");
}
这种是将实现类放到了同一个类的里面,
相较于上边的通过单独创建一个类来实现方法,有些进步。
那么让我们继续往下看
匿名内部类
public class classLambda {
public static void main(String[] args) {
// 匿名内部类实现
new interfaceLambda() {
@Override
public boolean methodLambda() {
System.out.println("匿名内部类实现");
}
}.methodLambda();
}
}
匿名内部类已经把代码简化到极致了,但是机智的大佬们感觉这样做还是是缺点东西,于是lambda表达式就横空出世了。
三、走进lambda表达式
使用条件
- 必须实现函数式接口
基本构成
- 参数列表
方法的实现部分,要求实现接口中的方法参数部分一致,包括参数数量和类型 - 箭头
- 方法体
让我们看一张图来加深对它的组成印象
使用
这里我用代码演示,在该大家细细的解释一下
public class classLambda {
public static void main(String[] args) {
//lambda表达式表示
interfaceLambda i = () -> {
System.out.println("lambda表达式实现");};
i1.methodLambda();
}
}
通过与上面匿名内部类的比较我们可以看到,使用lambda表达式省去了很多代码,但是却增加了阅读难度。