函数式接口不能被类继承,但可extends其他接口且必须保持仅一个抽象方法;核心是@FunctionalInterface标注、单一抽象方法约束及default方法安全增强。
Java 中函数式接口不参与传统意义上的“继承体系”,它本身不是用来被继承的,而是被实现的;设计重点在于语义清晰、职责单一、可组合,且必须严格满足“仅含一个抽象方法”的约束。
函数式接口用 @FunctionalInterface 标注,核心要求是:接口中**只有一个抽象方法**(默认方法、静态方法、重载的 Object 方法不计)。它不支持被类继承(因为接口不能被类 extends),但可以 extends 其他接口——前提是扩展后仍只保留一个抽象方法。
Function<T,R>)作为根,再通过 extends 定义更具体的变体(如 ToIntFunction<T> 是独立接口,不继承 Function,因其抽象方法签名不同)interface Bad extends Runnable, Comparable<String> { } —— 含两个抽象方法(run() 和 compareTo()),编译报错函数式接口可通过 default 方法提供通用行为,这是安全扩展的关键方式。这些方法不能改变“单抽象方法”本质,但能提升复用性与链式调用能力。
Function<T,R> 提供 andThen() 和 compose(),都是 default 方法,不新增抽象方法default T orElse(T fallback) { return this.apply() != null ? this.apply() : fallback; }(需注意避免副作用)Java 8+ 已提供覆盖大多数场景的函数式接口(Consumer、Supplier、Predicate、各类 Function 及其原始类型特化版)。自行设计前先确认是否已有匹配语义的现成接口。
立即学习“Java免费学习笔记(深入)”;
Function<String, Integer> + Predicate<Integer> 组合,比新建 StringToIntValidator 更灵活FilterCondition<User> 比 UserPredicate 更具业务表达力,但仍建议直接用 Predicate<User> 并配以清晰变量名(如 activeUserFilter)TriFunction<A,B,C,R> 而非强行塞进 BiFunction)函数式编程强调行为组合。与其设计多层接口继承(如 ValidatingFunction ← LoggingFunction ← BaseFunction),不如用高阶函数封装逻辑:
Function<X,Y>,返回增强后的 Function<X,Y>
static <T> Function<T, T> logBefore(Function<T, T> f) { return t -> { System.out.println("before: " + t); return f.apply(t); }; }