自定义无参无返回值函数式接口需用@FunctionalInterface标注且仅含一个void抽象方法(如run()),可添加默认/静态方法;Lambda或方法引用须严格匹配签名,优先复用Runnable。

在 Java 中,自定义一个无参、无返回值的函数式接口,只需定义一个只包含单个抽象方法(SAM)的接口,并用 @FunctionalInterface 注解标识即可。该方法必须没有参数、返回类型为 void。
接口定义规范
函数式接口的核心是“有且仅有一个抽象方法”。对于无参无返回值场景,这个方法签名就是 void run()(方法名可自选,如 execute、handle 等)。
- 必须使用
@FunctionalInterface(推荐,编译器会检查是否符合函数式接口要求) - 不能有多个抽象方法(默认方法、静态方法、私有方法不影响)
- 方法不能是
final或private
示例:自定义 Task 接口
以下是一个典型实现:
@FunctionalInterface
public interface Task {
void run(); // 唯一抽象方法:无参、无返回值
// 可选:添加默认方法(不破坏函数式接口性质)
default void before() {
System.out.println("准备执行...");
}
}
这个接口可以像 Runnable 一样被 Lambda 表达式或方法引用实现:
立即学习“Java免费学习笔记(深入)”;
Task t = () -> System.out.println("任务开始");Task t = System.out::println; // ❌ 错误!System.out::println 接收 String 参数,不匹配Task t = () -> doSomething(); // ✅ 正确,Lambda 体可调用任意无参无返回方法
与内置接口的对比
Java 已提供类似功能的接口,例如:
-
Runnable:最常用,语义上表示“可运行的任务”,方法名为run() -
Supplier<void></void>:不推荐——它有返回值(Void),且调用后需忽略返回值,语义和类型都不自然
除非需要特定语义(如领域模型中叫 Callback、Handler),否则优先复用 Runnable;若需扩展行为(如增加默认钩子方法),再考虑自定义。
使用注意事项
确保 Lambda 表达式或方法引用严格匹配方法签名:
- 不能写成
() -> "hello"(有返回值,编译报错) - 不能写成
(x) -> System.out.println(x)(有参数,不匹配) - 可以结合方法引用:若存在
public static void clean() { ... },则Task t = MyClass::clean;合法


















