Java通用泛型工具类设计关键是用<T>等占位符抽象类型,结合Predicate、Function等函数式接口实现行为可插拔,并通过Class<T>解决类型擦除问题,内置空值防护提升安全性。

Java 中编写通用泛型工具类,关键是把类型当作参数来设计,而不是为每种类型写一堆重复方法。核心是用 T、R 等占位符抽象数据结构,配合 JDK 标准函数式接口实现行为可插拔,同时内置空值防护和类型安全机制。
用泛型方法替代具体类型静态方法
不要为 String、Integer、User 单独写 getFirstString、getFirstInteger……统一用一个泛型方法:
- 声明时用
<T>表示输入输出类型可变,调用时由编译器推断 - 例如安全取列表首元素:
public static <T> T getFirst(List<T> list) - 带默认值的变体更实用:
public static <T> T getFirst(List<T> list, T defaultValue)
用标准函数式接口封装行为逻辑
避免自定义 FilterFunc、MapperFunc 等接口,直接复用 Predicate<T>、Function<T, R>、Consumer<T>:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Predicate<T>表达“是否保留该元素”,用于过滤 -
Function<T, R>表达“如何转换”,用于映射 - 组合使用如
filterAndMap(list, p -> p != null, User::getName)
处理泛型擦除带来的运行时限制
当需要在运行时知道泛型实际类型(比如 JSON 反序列化、反射构造),不能只靠 <T>:
立即学习“Java免费学习笔记(深入)”;
- 传入
Class<T>作为类型上下文,例如fromJson(String json, Class<T> clazz) - 或使用
TypeReference<List<User>>(Jackson 场景) - 不建议用
(T) new Object()强转,会丢失类型信息
内置防御性逻辑减少调用方负担
真实业务中 null 列表、null 元素、null 字段很常见,工具类应主动防护:
- 对入参做快速判空,空则返回 emptyList() 或 null,不抛 NPE
- 提供
safeMap(List<T>, Function<T, R>),内部跳过 null 元素 - 避免让每个业务代码都写
if (list != null && !list.isEmpty())

















