Java泛型数据处理工具类应使用<T>抽象类型、函数式接口实现行为可插拔,内置空值防护,复用JDK标准接口,必要时通过Class<T>解决泛型擦除问题。

Java 中编写通用的泛型数据处理工具类,核心在于利用 泛型类型参数 抽象数据结构,配合 函数式接口(如 Function、Predicate、Consumer) 实现行为可插拔,避免重复代码,同时保持类型安全。
定义泛型工具方法,不依赖具体类型
不要为 String、Integer、User 单独写一堆 static 方法。统一用 <T> 声明类型参数,让调用方决定实际类型:
public class DataUtils {
// 安全获取集合第一个元素,空则返回 null
public static <T> T getFirst(List<T> list) {
return list != null && !list.isEmpty() ? list.get(0) : null;
}
// 过滤并转换:先 filter 再 map,返回新列表
public static <T, R> List<R> filterAndMap(
List<T> source,
Predicate<T> predicate,
Function<T, R> mapper) {
if (source == null) return Collections.emptyList();
return source.stream()
.filter(predicate)
.map(mapper)
.collect(Collectors.toList());
}
}
支持链式操作与空值防护
实际业务中常遇到 null 列表、null 元素、null 字段。可在工具类中内置防御逻辑,减少调用方判空负担:
- 对入参做 null 检查,快速失败或优雅降级(如返回 emptyList)
- 提供带默认值的方法变体,例如
getFirst(List<T> list, T defaultValue) - 封装常用空值处理组合,如
safeMap(List<T>, Function<T, R>)内部跳过 null 元素
复用 JDK 函数式接口,避免自定义接口
优先使用 java.util.function 包中的标准接口,降低学习成本和耦合度:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 用
Predicate<T>表达“是否保留该元素”(过滤逻辑) - 用
Function<T, R>表达“如何把 T 转成 R”(映射逻辑) - 用
Supplier<T>提供默认值或延迟构造对象 - 避免为每种场景定义新接口(如 FilterFunc、MapperFunc),除非语义差异极大
必要时引入类型上下文,解决泛型擦除限制
当需要在运行时获取泛型实际类型(比如 JSON 反序列化、反射创建实例),可借助 TypeReference 或传入 Class<T>:
// 示例:安全反序列化 JSON 字符串为泛型列表
public static <T> List<T> jsonToList(String json, Class<T> itemType) {
try {
JavaType type = TypeFactory.defaultInstance()
.constructCollectionType(List.class, itemType);
return new ObjectMapper().readValue(json, type);
} catch (Exception e) {
throw new IllegalArgumentException("JSON parse failed", e);
}
}
注意:仅在确实需要运行时类型信息时才加 Class<T> 参数,多数工具方法无需它。

















