Object转换List「Map「String,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


版权声明:本文为qq_37274323原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。