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对象反射工具