Java函数式接口的核心是“一个抽象方法”约束,它决定Lambda绑定和Stream操作的类型匹配;Supplier、Consumer、Function、Predicate四接口按参数与返回值逻辑推导,构成函数式编程闭环。

Java函数式接口的核心考点不在死记硬背,而在理解“一个抽象方法”这个底层约束,以及它如何与Lambda、Stream形成闭环。理清逻辑比罗列接口更重要。
紧扣“单一抽象方法”这个铁律
所有函数式接口的起点都是:接口里只能有一个未实现的抽象方法。默认方法、静态方法、重写Object的方法(比如toString)全都不算数。加了@FunctionalInterface注解后,编译器会帮你盯住这条线——一旦多加一个抽象方法,直接报错。这是判断一个接口是不是函数式接口的唯一标准,也是Lambda能绑定它的根本原因。
四大接口按“参数-返回值”快速定位
不用硬背名字和用途,用两步法现场推导:
- 看要不要传参:没参数 → 考虑Supplier
- 看要不要返回值:要返回 → Supplier或Function;不要返回 → Consumer;只返回true/false → Predicate
比如Stream.filter()需要一个判断逻辑,输入一个元素,输出true或false,自然对应Predicate;map()要把String转成Integer,有入参有出参,就是Function。
Lambda是函数式接口的“快捷写法”,不是替代品
Lambda本身没有类型,它必须赋给某个函数式接口类型的变量,或者作为该接口类型的参数传入。例如Arrays.sort(list, (a,b) -> a.compareTo(b)),这里的(a,b) -> ... 实际上是实现了Comparator接口(它也是函数式接口)。脱离接口谈Lambda,就像没插座谈充电——没载体就无法运行。
Stream操作是函数式接口最密集的实战场景
一条Stream链里,几乎每个中间或终止操作都在用它们:
- filter(e -> e > 0) → Predicate
- map(s -> s.length()) → Function
- forEach(System.out::println) → Consumer
- findFirst().orElseGet(() -> "default") → Supplier
练熟这四个组合,就覆盖了90%的Stream使用需求,也真正把接口、Lambda、Stream三者串起来了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











