龙空技术网

【文27】详解Lambda表达式

小麦开发 177

前言:

目前各位老铁们对“lambda表达式由来”都比较看重,大家都需要分析一些“lambda表达式由来”的相关文章。那么小编同时在网摘上收集了一些有关“lambda表达式由来””的相关知识,希望我们能喜欢,小伙伴们一起来了解一下吧!

目录

什么是Lambda表达式?

Lambda表达式的语法规则

Lambda表达式与函数式接口

Lambda表达式与方法引用

Lambda表达式与Stream API

什么是Lambda表达式?

Lambda表达式是JAVA8中的一种新特性,是一个匿名函数,就是没有名字的函数。它的出现是为了帮助程序员写出更加简洁,更加灵活的程序。在之前的语法中,只有数值可以进行传递,但使用Lambda表达式则可实现代码块的传递。Lambda在Python、C++等语言中都得到很好的应用,本文主要基于Java进行介绍。

下面是非常经常用到的创建线程的代码:

创建线程

使用传统的方法会有如下的一些问题:

1、要使用run方法,必须实现Runnable接口;

2、必须对run方法进行重写,而且不能出错;

3、我们只关心run方法体中的代码,但其它代码又不得不实现。

从以上分析来看,传统的写法是比较复杂的。如果使用Lambda表达式对上述程序进行改造:

Lambda表达式创建线程

可以看出,语句变得清晰简洁了很多,语法也更简单。而这个过程则可以看成是将run方法体代码块作为整体赋值给了变量,作为Thread的参数,实现了代码的传递。

Lambda表达式的语法规则

Lambda表达式的标准格式由三个部分组成,分别为参数列表、方法体和箭头“->”。

(参数类型 参数名称) -> {

代码体;

}

定义一个接口:

调用:

传统方法和Lambda方法都可以打印出log,但明显Lambda表达式更简单。

Lambda表达式与函数式接口

Lambda表达式使用前提是需要有函数式接口,函数式接口指的是只有一个方法的接口,因为只有一个方法,所以可以简写,不需要关注具体使用了接口内部哪个方法。也可以通过添加@FunctionalInterface标志注解,被注解的接口只能声明一个抽象方法。

除了自定义的函数式接口,JDK中也提供了大量的函数式接口,方便我们可以使用Lambda表达式。

1、Supplier

Supplier是一个无参数,有返回值的接口,返回一个数据类型。

1、 Consumer

Consumer是一个有参数,无返回值的接口。主要用来处理传入的数据。

2、 Function

Function是一个有参数,有返回值的接口。

3、 Predicate

Predicate是有参数,返回值为Boolean类型的接口。

在Predicate的默认方法中还提供了一些逻辑关系操作,如and、or、isEquals等方法。

Lambda表达式与方法引用

在Lambda方法体中的很有可能实现的是重复的代码,对于这种已经有方法实现的情况,就可以使用方法引用来使用已有方法。

通过使用两个冒号“::”来进行方法引用,形式也很灵活,有对象名::方法名,类名::静态方法,类名::普通方法,类名::构造器,数组::构造器几种形式。

最常用当属对象名::方法名的引用方法。

以上将Lambda获取时间的方法体,使用方法引用的方式,更加的简单。

Lambda表达式与Stream API

在Java传统集合的使用上,针对不同的需求,需要通过一次次的遍历达到处理数据的目的,这就造成了代码的冗余和效率的降低。而Stream API就相当于一个流水线作业,将不同的需求串起来,得到最终的“成品”。

使用传统的方法获取集合中张姓三个字名字的列表,如下:

而使用Stream后,一串代码就搞定:

写在最后

Lambda表达式作为JAVA8主要的新特性,并不是非用不可,但学会并灵活运用,可以让代码逻辑更加的清晰简单,在阅读别人使用Lambda的程序里也更加的容易,所以,Lambda表达式还是很有必要掌握的。

标签: #lambda表达式由来