lambda表达式与函数式接口

Java 8 新特性如下图所示,其中最重要的两个新特性是: Lambda表达式和Stream API。

Lambda表达式

lambda表达式与函数式接口

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。Lambda表达式的本质:作为函数式接口的实例。

Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操 作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符 或箭头操作符。它将 Lambda 分为两个部分:左侧:指定了 Lambda 表达式需要的参数列表 ;右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即 Lambda 表达式要执行的功能。
语法格式共有6种,如下图所示:

lambda表达式与函数式接口
 

lambda表达式与函数式接口 上述 Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。

 函数式接口

 Lambda表达式的本质:作为函数式接口的实例。也就是说Lambda表达式必须依赖于函数式接口。

什么是函数式(Functional)接口:

  • 只包含一个抽象方法的接口,称为函数式接口。 
  • 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式 抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
  • 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检 查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
  • 在java.util.function包下定义了Java 8 的丰富的函数式接口。
     

在 Java8中,Lambda表达式是对象,而不是函数,它们必须依附于一类特别的 对象类型——函数式接口。

在Java8中,Lambda表达式就是一个函数式接口的实例。这就是 Lambda表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口 的实例,那么该对象就可以用Lambda表达式来表示。  

所以以前用匿名实现类(只需实现一个抽象方法)表示的现在都可以用Lambda表达式来写。

lambda表达式与函数式接口