【Java】Object转换ListList<Map<String,Object>>

0.使用场景

1
List<Map<String,Object>> users = (List<Map<String,Object>>) Obj;

使用的时候IDEA会提示警告 说未检查类型.

1.解决办法

  1. 使用@SuperWarning({“unchecked”})进行压制
  2. 写个工具类进行转换

1.1 方法1

1
2
@SuperWarning({"unchecked"})
List<User> users = (List<User>) Obj;

1.2 方法2

写的时候参考了我的 Object 转换 List<Object> 的写法,只是说在处理o的时候再次进行了转换获得每个key和value.
写完Object转换List后大概想了1个多小时才想到这个方式, 真的佩服自己的愚蠢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static  List<Map<String,Object>> objConvertListMap(Object obj) throws IllegalAccessException {
List<Map<String,Object>> result = new ArrayList<>();
if (obj instanceof List<?>){
for (Object o : (List<?>) obj) {
Map<String,Object> map = new HashMap<>(16);
Class<?> clazz = o.getClass();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String key = field.getName();
Object value = field.get(key);
if (value == null){
value = "";
}
map.put(key,value);
}
result.add(map);
}
return result;
}
return null;
}

写完博文几分钟后,突然想到一个更加通用的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static <V> List<Map<String,V>> objConvertListMap(Object obj, Class<V> vClass) throws IllegalAccessException {
List<Map<String, V>> result = new ArrayList<>();
if (obj instanceof List<?>) {
for (Object o : (List<?>) obj) {
Map<String, V> map = new HashMap<>(16);
Class<?> oClass = o.getClass();
for (Field field : oClass.getDeclaredFields()) {
field.setAccessible(true);
String key = field.getName();
Object value = field.get(key);
if (value == null) {
value = "";
}
map.put(key, vClass.cast(value));
}
result.add(map);
}
return result;
}
return null;
}

这样就不会局限在转换到List<Map<String,Object>>这一种类型上了.
可以转换成List<Map<String,V>>上等,进行泛型转换
虽然多了一个参数,但是可以重载啊

注: 感觉field.get(key) 这里处理的不是很好,如果有更好的办法可以留言

1.3 方法3(感谢 凌霄。 大佬提供)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static <K, V> List<Map<K, V>> castListMap(Object obj, Class<K> kCalzz, Class<V> vCalzz) {
List<Map<K, V>> result = new ArrayList<>();
if (obj instanceof List<?>) {
for (Object mapObj : (List<?>) obj) {
if (mapObj instanceof Map<?, ?>) {
Map<K, V> map = new HashMap<>(16);
for (Map.Entry<?, ?> entry : ((Map<?, ?>) mapObj).entrySet()) {
map.put(kCalzz.cast(entry.getKey()), vCalzz.cast(entry.getValue()));
}
result.add(map);
}
}
return result;
}
return null;
}
注:

个人不喜欢使用注解消除警告,因为觉得这个消除了,但是仍然存在隐患. 所以选择使用静态方法进行转换. 结果可控.


【Java】Object转换List<Map<String,Object>>
https://www.yangxj96.com/Java/Object2ListMap/
作者
道一
发布于
2022年12月23日
许可协议