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) 這裏處理的不是很好,如果有更好的辦法可以留言

注:

個人不喜歡使用註解消除警告,因爲覺得這個消除了,但是仍然存在隱患. 所以選擇使用靜態方法進行轉換. 結果可控.

寫在最後

本人爲純小白,所寫的博客也是因爲學習使用中遇到的問題進行查找資料然後解決後才編寫的,其中如果有某些有錯誤,或者涉及侵權的請聯繫我,

QQ : 994961015
E-mail: [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章