如何实现更具动态性的多对象泛型时间间隔列表生成方法?
问题解答
1. 是否可以创建泛型实例列表?
可以直接创建泛型实例列表,Java泛型的核心作用就是提供编译期类型安全检查,避免运行时类型转换错误。示例:
// 创建String类型的泛型列表 List<String> stringList = new ArrayList<>(); // 创建自定义类型的泛型列表 List<ObjectA> objectAList = new ArrayList<>();
2. 优化重复逻辑的泛型方法
你的现有代码存在大量重复的流处理逻辑,核心原因是ObjectA/ObjectB/ObjectC没有统一的类型契约来规范startDate和endDate的获取行为。以下是两种更优雅的优化方案:
方案一:定义统一接口(推荐)
如果可以修改ObjectA/ObjectB/ObjectC的代码,最规范的做法是定义一个包含日期获取方法的接口,让这三个类实现该接口:
// 定义统一的时间区间接口 public interface HasTimeInterval { Timestamp getStartDate(); Timestamp getEndDate(); } // 让ObjectA实现该接口(ObjectB、ObjectC同理) public class ObjectA implements HasTimeInterval { // 原有字段和业务方法 private Timestamp startDate; private Timestamp endDate; @Override public Timestamp getStartDate() { return this.startDate; } @Override public Timestamp getEndDate() { return this.endDate; } }
然后修改TimeIntervalObj的静态方法,利用泛型接收实现该接口的集合:
@Data @AllArgsConstructor @NoArgsConstructor public class TimeIntervalObj { private Timestamp startDate; private Timestamp endDate; public static <T extends HasTimeInterval> List<TimeIntervalObj> constructTimeIntervals(List<T> list) { return list.stream() .map(item -> new TimeIntervalObj(item.getStartDate(), item.getEndDate())) .collect(Collectors.toList()); } }
后续新增类似的类,只要实现HasTimeInterval接口就能直接复用该方法,完全消除重复逻辑。
方案二:函数式参数适配(无法修改原有类时使用)
如果ObjectA/ObjectB/ObjectC是第三方类、无法修改源码,可以通过传入函数式接口动态获取日期字段,避免类型判断:
@Data @AllArgsConstructor @NoArgsConstructor public class TimeIntervalObj { private Timestamp startDate; private Timestamp endDate; public static <T> List<TimeIntervalObj> constructTimeIntervals(List<T> list, Function<T, Timestamp> startDateGetter, Function<T, Timestamp> endDateGetter) { return list.stream() .map(item -> new TimeIntervalObj(startDateGetter.apply(item), endDateGetter.apply(item))) .collect(Collectors.toList()); } }
调用时只需传入对应的字段获取方法:
// 处理ObjectA集合 List<TimeIntervalObj> aIntervals = TimeIntervalObj.constructTimeIntervals(objectAList, ObjectA::getStartDate, ObjectA::getEndDate); // 处理ObjectB集合 List<TimeIntervalObj> bIntervals = TimeIntervalObj.constructTimeIntervals(objectBList, ObjectB::getStartDate, ObjectB::getEndDate);
这种方式无需修改原有类,同时保持了代码的灵活性和无重复性。
内容的提问来源于stack exchange,提问作者Konstantinos K.
相关产品推荐
相关产品推荐

