Java中自定义函数式接口作参数需满足:有且仅有一个抽象方法,用@FunctionalInterface标注;方法参数类型直接声明该接口;调用时传lambda、方法引用或匿名内部类实现;注意签名匹配、异常处理及泛型支持。

在 Java 中,将自定义函数式接口作为方法参数传递,核心是:接口必须有且仅有一个抽象方法(SAM),然后用 lambda 表达式、方法引用或匿名内部类实现它,并作为实参传入。
1. 定义符合函数式接口规范的自定义接口
使用 @FunctionalInterface 注解显式声明,确保编译器检查其是否真正只有一个抽象方法(可含 default/static 方法):
@FunctionalInterface
public interface StringProcessor {
String process(String input); // 唯一抽象方法
default boolean isValid(String s) {
return s != null && !s.trim().isEmpty();
}
}
2. 在方法中声明该接口为参数类型
把自定义函数式接口当作普通参数类型使用,无需特殊语法:
public static void handleText(String text, StringProcessor processor) {
if (processor.isValid(text)) {
String result = processor.process(text);
System.out.println("处理结果:" + result);
}
}
3. 调用时传入 lambda 或方法引用
调用方直接提供逻辑,无需提前定义实现类:
立即学习“Java免费学习笔记(深入)”;
- 用 lambda 实现(最常用):
handleText("hello", s -> s.toUpperCase()); - 用方法引用(当已有适配方法):
handleText("world", String::toLowerCase); - 用匿名内部类(不推荐,冗长):
handleText("java", new StringProcessor() { public String process(String s) { return "[" + s + "]"; } });
4. 注意事项与常见问题
- 接口不能有两个及以上抽象方法,否则编译报错“not a functional interface”
- lambda 参数类型和返回值需与接口中抽象方法签名严格匹配
- 若接口方法抛出受检异常,lambda 内也必须处理或声明,否则编译失败
- 泛型函数式接口同样适用,例如
BiFunction<String, Integer, Boolean>可替换为你自己的StrIntPredicate


















