Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
image.png
image.png
image.png
image.png
这样,我们就成功的非常优雅的把“一块代码”赋给了一个变量。而“这块代码”,或者说 “这个被赋给一个变量的函数”,就是一个 Lambda 表达式。
但是这里仍然有一个问题,就是变量 aBlockOfCode 的类型应该是什么?
在 Java 8 里面,所有的 Lambda 的类型都是一个接口,而 Lambda 表达式本身,也就是” 那段代码“,需要是这个接口的实现。这是我认为理解 Lambda 的一个关键所在,简而言之 就是,Lambda 表达式本身就是一个接口的实现。直接这样说可能还是有点让人困扰,我们 继续看看例子。我们给上面的 aBlockOfCode 加上一个类型 :
image.png
这种只有一个接口函数需要被实现的接口类型,我们叫它”函数式接口“。为了避免后来 的人在这个接口中增加接口函数导致其有多个接口函数需要被实现,变成”非函数接口”,我 们可以在这个上面加上一个声明@FunctionalInterface, 这样别人就无法在里面添加新的接口函数了
image.png

Lambda表达式作用

image.png

接口要求

虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可 以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规 定接口中只能有一个方法。
jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被 实现的方法,所以不影响 Lambda 表达式的使

@FunctionalInterface注解作用

@FunctionalInterface 标记在接口上,“函数式接口”是指仅仅只包含一个抽象方法的接口。