函数式接口是java 8函数式编程起点,核心为“一个抽象方法+四大接口(consumer、supplier、function、predicate)+lambda/stream落地”。必须仅含一个未实现抽象方法,可用@functionalinterface校验;四大接口分别用于消费、供给、转换、判断,且与stream等api深度绑定。

函数式接口是 Java 8 函数式编程的起点,复习时抓住“一个抽象方法 + 四大核心接口 + Lambda 落地场景”这条主线,就能稳住大部分考点和实战需求。
紧扣定义:只允许一个抽象方法
函数式接口的本质不是名字里带“Function”,而是接口中有且仅有一个未实现的抽象方法。默认方法(default)、静态方法(static)、重写 Object 的方法(如 toString())都不算在内。
- 必须用
@FunctionalInterface注解——它不是语法必需,但加了能触发编译器检查,避免误加第二个抽象方法 - 像
Runnable、Comparable、Callable这些 JDK 早已存在的接口,只要满足“单抽象方法”,就是天然的函数式接口 - 自己定义时别写两个
public abstract方法,否则编译直接报错:Unexpected @FunctionalInterface annotation
熟记四大核心接口及典型用法
Java 在 java.util.function 包中预置了 40+ 个函数式接口,但日常开发和面试 90% 场景靠这四个撑住:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
Consumer
:接收一个参数,不返回结果 → 常用于遍历、打印、修改对象状态
例:list.forEach(s -> System.out.println(s.toUpperCase())) -
Supplier
:不接收参数,返回一个结果 → 常用于延迟创建、生成默认值或随机数
例:Supplier<localdatetime> now = LocalDateTime::now</localdatetime> -
Function
:接收 T,返回 R → 核心用于类型转换与映射
例:Function<string integer> str2int = Integer::parseInt</string>;支持链式组合:f1.andThen(f2) -
Predicate
:接收 T,返回 boolean→ 主要用于条件判断和过滤
例:Predicate<string> isLong = s -> s.length() > 5</string>;可叠加:p1.and(p2).negate()
关联 Lambda 和 Stream,拒绝孤立记忆
函数式接口本身不运行,它的价值体现在被 Lambda 实现、被 Stream 方法接收。复习时一定要配对理解:
-
Stream.filter()参数类型是Predicate→ 所以filter(x -> x > 0)就是在传一个Predicate实例 -
Stream.map()接收Function→map(String::length)就是Function<string integer></string> -
Optional.orElseGet()参数是Supplier→ 保证空值时才执行创建逻辑,避免无谓开销 - 方法引用(
::)本质就是 Lambda 的简写,背后仍是某个函数式接口的实例
动手验证几个关键细节
光看容易忽略边界情况,建议手写几行代码确认:
- 给
Consumer写个andThen()链,观察执行顺序 - 用
Function的compose()和andThen()对比效果:哪个先执行? - 把
Predicate和Function<t boolean></t>对比——后者不是标准断言接口,不能直接用于filter() - 尝试在自定义接口里加两个抽象方法,再加
@FunctionalInterface,看编译器是否拦截
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










