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>这一种类型上了.
可以转换成List>上等,进行泛型转换
虽然多了一个参数,但是可以重载啊

注: 感觉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;
	}

注:

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

你可能感兴趣的:(java,java)