Object转换List「Map「String,Object」」

2023-01-02 00:00:00 list object 转换

使用场景

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

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

解决办法

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

方法1

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

方法2

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

  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;
    }

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

    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) 这里处理的不是很好,如果有更好的办法可以留言

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

	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;
	}

注:

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

写在最后

本人为纯小白,所写的博客也是因为学习使用中遇到的问题进行查找资料然后解决后才编写的,其中如果有某些有错误,或者涉及侵权的请联系我,

QQ : 994961015
E-mail: yangxj96@126.com

    原文作者:道一哥哥
    原文地址: https://blog.csdn.net/qq_37274323/article/details/107155178
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章