函数式接口是Java 8函数式编程基石,核心在于单抽象方法定义、作为参数/返回值传递行为、四大内置接口(Supplier/Consumer/Predicate/Function)及方法引用与泛型边界应用。

函数式接口是Java 8函数式编程的基石,也是面试和实际开发中的高频考点。掌握它不靠死记,关键在理清三条主线:定义本质、使用场景、核心接口。
定义本质:一个抽象方法 + 编译器校验
函数式接口不是语法糖,而是有明确定义的类型约束:
- 必须且只能有一个抽象方法(注意:Object类的public方法如equals、hashCode、toString不算在内)
- 允许任意数量的默认方法、静态方法、私有方法
- @FunctionalInterface是编译期检查注解,不是必需但强烈推荐——写错会直接报错,帮你提前发现设计问题
- 即使没加该注解,只要满足“单抽象方法”,JVM仍视其为函数式接口;但加了就能防误改、提升可读性
使用场景:参数传逻辑,返回藏行为
函数式接口的价值体现在“把动作当数据用”,主要出现在两类地方:
- 作为方法参数:比如Collections.sort(list, (a,b) -> a.length()-b.length()),Comparator就是函数式接口,Lambda替换了匿名内部类
-
作为方法返回值:比如写一个工厂方法,返回Predicate
p = containsIgnoreCase("java"),调用方拿到的就是可复用的判断逻辑 - 不要只盯着Lambda——实现类、匿名内部类仍是合法用法,只是Lambda最简洁
四大核心接口:按输入输出对号入座
JDK的java.util.function包已封装好常用模式,记清它们的“签名+用途”比背名字更重要:
立即学习“Java免费学习笔记(深入)”;
-
Supplier
:无入参,有出参 → 适合延迟创建对象,如() -> new Date() -
Consumer
:有入参,无返回 → 适合执行副作用操作,如s -> System.out.println(s) -
Predicate
:有入参,返回boolean → 适合条件判断,如n -> n > 0 -
Function
:有入参,有出参(类型可不同)→ 适合数据转换,如x -> x.toString()
它们都支持链式调用(andThen、compose、negate等),这是进阶得分点。
进阶细节:方法引用与泛型边界
真正在项目里用得稳,还得注意两个易错点:
-
方法引用要匹配签名:String::length 是 Function
,不是 Consumer ;System.out::println 是 Consumer ,不能塞给 Supplier -
泛型函数式接口需注意类型推导:自定义Converter
时,若T是Number子类,R是String,Lambda里别忘了类型安全转换,避免运行时ClassCastException - 接口中default/static方法不能破坏“单抽象”原则,但可以增强复用性,比如Comparator.reversed()就是典型默认方法


















