
当需要将 function
在 Java 泛型中,Void 是一个不可实例化的占位类型(其构造函数为 private),唯一合法的值只有 null。因此,Function<Void, R> 在类型层面就强制传达了两个关键契约:
- 调用方必须且只能传入 null(如 func.apply(null));
- 实现方不得依赖参数做任何有意义的计算(因为无非 null 值可传)。
这比使用 Function<Object, R> 或 Function<?, R> 更加精确、安全且自文档化。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// ✅ 推荐:语义清晰,编译期约束强 Function<Void, String> uuidSupplier = ignore -> UUID.randomUUID().toString(); // 使用方式(明确体现“忽略参数”意图) String id = uuidSupplier.apply(null); // 唯一合法调用 // ❌ 不推荐:类型宽泛,无法表达设计意图 Function<Object, String> badSupplier = obj -> UUID.randomUUID().toString(); String id2 = badSupplier.apply(new Object()); // 参数被误用风险高
⚠️ 注意事项:
- Void 并非“void”,后者是关键字,表示无返回值;而 Void 是 java.lang.Void,是一个引用类型;
- 不要试图 new Void() —— 它会编译失败;
- 若 API 允许,优先直接使用 Supplier<R>;仅在需兼容 Function 接口(如某些框架回调、泛型工具方法约束)时,才选用 Function<Void, R>;
- 同理,若需将 Consumer 表达为 Function(如适配某些函数式接口链),应使用 Function<T, Void>,并始终返回 null。
总结:Function<Void, R> 是一种轻量、标准、类型安全的惯用法,用于在必须使用 Function 接口的场景下,优雅地模拟 Supplier 行为,并通过类型系统向调用者和维护者清晰传递“参数被刻意忽略”的设计意图。

















