使用 Void 类型明确表达函数参数被忽略的设计意图

当需要将 function 用作逻辑上的 supplier(即忽略输入参数、仅依赖其副作用或内部状态返回结果)时,最佳实践是将类型参数 t 替换为 void,声明为 function,以此语义化地表明该函数只接受 null 输入且不使用参数。

在 Java 泛型中,Void 是一个不可实例化的占位类型(其构造函数为 private),唯一合法的值只有 null。因此,Function 在类型层面就强制传达了两个关键契约:

  • 调用方必须且只能传入 null(如 func.apply(null));
  • 实现方不得依赖参数做任何有意义的计算(因为无非 null 值可传)。

这比使用 Function 或 Function, R> 更加精确、安全且自文档化。例如:

// ✅ 推荐:语义清晰,编译期约束强
Function uuidSupplier = ignore -> UUID.randomUUID().toString();

// 使用方式(明确体现“忽略参数”意图)
String id = uuidSupplier.apply(null); // 唯一合法调用

// ❌ 不推荐:类型宽泛,无法表达设计意图
Function badSupplier = obj -> UUID.randomUUID().toString();
String id2 = badSupplier.apply(new Obje

ct()); // 参数被误用风险高

⚠️ 注意事项:

  • Void 并非“void”,后者是关键字,表示无返回值;而 Void 是 java.lang.Void,是一个引用类型;
  • 不要试图 new Void() —— 它会编译失败;
  • 若 API 允许,优先直接使用 Supplier;仅在需兼容 Function 接口(如某些框架回调、泛型工具方法约束)时,才选用 Function
  • 同理,若需将 Consumer 表达为 Function(如适配某些函数式接口链),应使用 Function,并始终返回 null。

总结:Function 是一种轻量、标准、类型安全的惯用法,用于在必须使用 Function 接口的场景下,优雅地模拟 Supplier 行为,并通过类型系统向调用者和维护者清晰传递“参数被刻意忽略”的设计意图。