You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将两个相似的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:37:47