函数式接口的核心是“一个抽象方法”,需满足有且仅有一个未实现的抽象方法;@FunctionalInterface注解用于编译期校验;Lambda是其实例化方式;Consumer、Supplier、Function、Predicate为四大内置接口。

函数式接口是Java 8函数式编程的基石,理清它不需要堆砌概念,关键是抓住“一个抽象方法”这个核心,再串联起注解、Lambda、内置接口和使用场景这四条主线。
紧扣“唯一抽象方法”这个定义
函数式接口的本质判断标准只有一个:接口中必须有且仅有一个未被实现的抽象方法(不计默认方法、静态方法、Object类继承的方法)。比如:
-
合法:只含一个抽象方法
apply(T t)的Function<t></t> -
合法:含
test(T t)+ 一个默认方法and()+ 一个静态方法isEqual()的Predicate<t></t> -
非法:定义了
get()和set(T t)两个抽象方法的接口(编译报错)
@FunctionalInterface 注解是编译期守门员
这个注解不是必需的,但强烈建议加上——它不改变运行行为,只在编译时强制校验:
- 加了注解后,如果接口意外多了一个抽象方法,
javac直接报错,避免后期误用 - 没加注解,只要满足“唯一抽象方法”,仍是函数式接口,只是失去编译保护
- 它本身是空注解(无属性),纯粹用于语义提示和编译检查
Lambda 表达式是它的自然搭档
Lambda 不是语法糖,而是函数式接口的**实例化方式**。只要类型是函数式接口,就能用 Lambda 替代匿名内部类:
立即学习“Java免费学习笔记(深入)”;
- 原来要写:
new Runnable() { public void run() { ... } } - 现在可写:
() -> { ... }—— 因为Runnable是函数式接口(仅含run()) - 参数类型、括号、大括号都可按规则省略,但底层始终绑定到那个唯一的抽象方法签名
四大核心内置接口是高频主力
JDK 已为你准备好最常用场景的函数式接口,不必重复造轮子:
-
Consumer
:消费型, void accept(T t),适合无返回的处理(如打印、存库) -
Supplier
:供给型, T get(),适合无参构造或生成数据(如ArrayList::new) -
Function
:函数型, R apply(T t),适合类型转换(如字符串转大写) -
Predicate
:断言型, boolean test(T t),适合条件判断(如过滤偶数)
它们都有配套的默认方法(如 and、or、compose),支持链式组合。


















