如何将两个相似的Java对象映射方法合并为一个?
通用映射方法实现方案
可以通过泛型+函数式接口解决你遇到的三个问题,无需反射,同时保留类型安全。
通用方法代码
import java.util.List; import java.util.Comparator; import java.time.LocalDate; import java.util.function.Function; import java.util.function.BiConsumer; public <T> void mapClassToClassA(List<T> sourceList, List<ClassA> targetList, Function<T, LocalDate> dateExtractor, BiConsumer<ClassA, T> setter) { // 用传入的dateExtractor创建比较器,解决排序问题 Comparator<T> sortFunc = Comparator.comparing(dateExtractor); sourceList.sort(sortFunc); // 替代Collections.sort,List自带sort方法更简洁 for (ClassA aObj : targetList) { LocalDate dateA = aObj.getDate(); T objToUse = null; for (T obj : sourceList) { LocalDate dateT = dateExtractor.apply(obj); // 用dateExtractor获取日期,替代直接调用getDate() if (dateT.isAfter(dateA)) { break; } else { objToUse = obj; } } if (objToUse != null) { setter.accept(aObj, objToUse); // 用传入的setter处理不同的set方法 } } }
调用方式
映射ClassB到ClassA
mapClassToClassA(classBList, classAList, ClassB::getDate, // 提取ClassB的日期 ClassA::setClassB); // 调用ClassA的setClassB方法
映射ClassC到ClassA
mapClassToClassA(classCList, classAList, ClassC::getDate, // 提取ClassC的日期 ClassA::setClassC); // 调用ClassA的setClassC方法
问题解决说明
- 问题1:创建Comparator:通过传入
Function<T, LocalDate>类型的dateExtractor,用Comparator.comparing(dateExtractor)直接生成比较器,完全兼容任意拥有getDate()方法的类。 - 问题2:获取日期:通过
dateExtractor.apply(obj)获取日期,避免直接依赖T的具体方法,同时保持类型安全,无需反射。 - 问题3:处理不同set方法:通过传入
BiConsumer<ClassA, T>类型的setter,将具体的赋值逻辑(比如setClassB/setClassC)作为参数传入,完美适配不同的设置方法。
内容的提问来源于stack exchange,提问作者StarMcSnow
相关产品推荐
相关产品推荐

