函数式接口作为返回值应交付可复用行为而非计算结果,优先使用JDK标准接口(Predicate、Function等),确保无状态与线程安全,并支持链式组合。

函数式接口作为方法返回值,核心是交付“可复用的行为”,而不是一次性计算结果。设计得当,能让调用方自然组合、延迟执行、避免重复编码。
明确返回行为而非数据
返回函数式接口,本质是暴露策略逻辑。比如校验用户名,不应直接返回 boolean,而应返回 Predicate
- ❌ 不推荐:
public boolean isValidUsername(String name) { ... }—— 每次调用都执行,无法复用逻辑或与其他条件组合 - ✅ 推荐:
public Predicate<string> usernameValidator() { return s -> s != null && s.length() >= 3 && s.matches("[a-zA-Z0-9_]+"); }</string>—— 调用方可直接.test("abc"),也可.and(myCustomCheck)扩展
优先选用 JDK 标准接口
少自定义,多复用。JDK 提供的接口语义清晰、工具链支持好:
- 需要转换(输入→输出):用 Function
,如 public Function<string integer> stringLengthMapper()</string> - 需要判断:用 Predicate
,如上例中的校验器 - 需要无参生成:用 Supplier
,如 public Supplier<localdatetime> nowProvider() { return LocalDateTime::now; }</localdatetime> - 需要消费但不返回:用 Consumer
,适合回调类场景 - 仅在语义完全不匹配时(如三参数+抛检异常),才考虑自定义接口,并配全 Javadoc
提供开箱即用 + 支持组合
好的 API 应同时降低入门门槛和提升扩展能力:
立即学习“Java免费学习笔记(深入)”;
- 内置常用实例:如
Validators.notBlank()、Formatters.toUppercase() - 返回值本身支持链式组合:标准接口自带
and()、or()、negate()(Predicate),andThen()(Function)等默认方法 - 避免强制用户写 lambda:例如返回
Comparator<user> byAgeThenName()</user>,比要求用户传入 lambda 更简洁安全
确保无状态与线程安全
返回的函数式接口实例,必须能被多线程安全调用:
- ✅ 安全写法:
return s -> s.trim().length();(纯函数,无外部变量) - ⚠️ 危险写法:
int count = 0; return () -> ++count;(共享可变状态,高并发下结果不可靠) - 若需内部状态,应封装在线程安全结构中(如
AtomicInteger或ThreadLocal),并明确文档说明


















