List字段转换工具 – ConvertFiledUtil

在针对page或者list接口的时候,需要转换对应的属性值是比较麻烦的。需要我们手动遍历对象,然后编写对应的转换方法。在多个转换的字段的时候,代码是非常长的。本工具可以一行实现字段转换。我个人觉得较为优雅。

代码语言:javascript代码运行次数:0运行复制
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.lang.reflect.Field;

/**
 * 字段转换工具类
 * 作者: zanglikun
 * 日期: 2024/7/19 上午11:16
 * 版权所有 © zanglikun
 */
public class ConvertFiledUtil {

    /**
     * 使用键值对映射更新对象列表中的字段
     *
     * @param list         目标列表
     * @param map          键值对映射 注意Key的类型
     * @param keyExtractor 提取键的函数 注意与Key的类型是否一致
     * @param valueSetter  设置值的函数
     * @param <T>          列表中对象的类型
     * @param <K>          键的类型
     * @param <V>          值的类型
     */
    public static <T, K, V> void updateListField(List<T> list, Map<K, V> map,
                                                 Function<T, K> keyExtractor, BiConsumer<T, V> valueSetter) {
        for (T item : list) {
            K key = keyExtractor.apply(item);
            if (map.containsKey(key)) {
                V value = map.get(key);
                valueSetter.accept(item, value);
            }
        }
    }

    /**
     * 使用反射更新对象列表中的字段
     *
     * @param list         目标列表
     * @param map          键值对映射
     * @param mapKeyField  用于映射的字段名
     * @param replaceField 要更新的字段名
     * @param <T>          列表中对象的类型
     * @param <K>          键的类型
     * @param <V>          值的类型
     */
    public static <T, K, V> void updateListField(List<T> list, Map<K, V> map, String mapKeyField, String replaceField) {
        for (T item : list) {
            try {
                // 通过反射获取 mapKeyField 字段的值
                Field keyField = item.getClass().getDeclaredField(mapKeyField);
                keyField.setAccessible(true);
                @SuppressWarnings("unchecked")
                K key = (K) keyField.get(item);

                // 从 map 中获取对应的值
                V value = map.get(key);

                // 通过反射设置 replaceField 字段的值
                Field valueField = item.getClass().getDeclaredField(replaceField);
                valueField.setAccessible(true);
                valueField.set(item, value);
            } catch (NoSuchFieldException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}

工具类测试代码演示

代码语言:javascript代码运行次数:0运行复制
    @Override
    public List<AccountIpRecord> selectAccountIpRecordList(AccountIpRecord accountIpRecord) {
        // 获取账户IP记录列表
        List<AccountIpRecord> originList = accountIpRecordMapper.selectAccountIpRecordList(accountIpRecord);

        // 提取唯一的 charId
        List<Integer> charIds = originList.stream()
                .map(ele -> Integer.parseInt(ele.getCharid().toString())).distinct()
                .collect(Collectors.toList());

        // 获取角色名称数据
        List<MapKeyValue> charNameData = CollectionUtils.isEmpty(charIds)
                ? Collections.emptyList()
                : charsMapper.getCharNameByCharIds(charIds);

        // 将角色名称数据转换为映射
        Map<Long, String> charNameMap = charNameData.stream()
                .collect(Collectors.toMap(mapKeyValue -> Long.valueOf(mapKeyValue.getMapKey()), MapKeyValue::getMapValue));

        // 更新角色名称
        ConvertFiledUtil.updateListField(originList, charNameMap, AccountIpRecord::getCharid, AccountIpRecord::setCharName);

        // 提取唯一的客户端IP
        List<String> ipList = originList.stream().map(AccountIpRecord::getClientIp).distinct().collect(Collectors.toList());

        // 获取IP地区映射
        Map<String, String> ipRegionMap = Ip2AddressForJar.getContryCityHasFromatMap(ipList);

        // 更新客户端地址
        ConvertFiledUtil.updateListField(originList, ipRegionMap, AccountIpRecord::getClientIp, AccountIpRecord::setClientAddr);
        return originList;
    }

特殊说明: 上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-04-06,如有侵权请联系 cloudcommunity@tencent 删除函数list对象反射工具