Java 8 函数式接口 functional interface

原文参考:Secrets of Java 8 Functional Interface(colobu,2014) 概述 函数式接口不是一种新类型,而是 Java 8 对一类早已存在的接口给出的正式定义与命名:接口中恰好有一个抽象方法(SAM,Single Abstract Method),因此可以作为 Lambda 表达式或方法引用的目标类型。判定细节见下一节 SAM 定义。 可以这样理解二者关系: 概念 角色 Lambda / 方法引用 Java 8 新语法,表达「一段可传递的逻辑」 函数式接口 类型契约——Lambda 不能单独存在,必须赋给通过 SAM 判定的接口 Java 8 没有新增独立的函数类型(arrow type),而是继续用 interface 承载函数语义。JDK 8 之前已有不少接口在结构上符合 SAM(如 Runnable、Comparator),只是当时没有「函数式接口」这一术语,也不能写 Lambda 赋给它们;Java 8 把 SAM 规则写进语言规范,并新增 java.util.function 包中的标准函数式接口。 函数式接口代表一种契约:在需要它的上下文中,实际期望的是符合该契约的函数。Lambda 不能脱离上下文存在,必须有一个明确的目标类型,而这个目标类型必须是通过 SAM 判定的函数式接口。 SAM(Single Abstract Method) SAM 即 Single Abstract Method:接口中恰好有一个抽象方法(合并父接口继承来的抽象方法,并按规则排除 Object 的 public 方法)。 SAM 是函数式接口的判定标准 「函数式接口」是 Javadoc 和语言特性里的叫法;SAM 是判定它是否成立的结构规则。二者在 Java 8 里指同一类接口,只是视角不同: ...

Created 24246-12-24 · Updated 20206-06-20 · 6 min · 1066 words · -