使代碼更簡潔(二)----集合轉換相關

博客搬移到這裏:http://yemengying.com/
有個本身的博客還蠻好玩的,bazinga!ios

記錄一下在工做開發中封裝的一些工具類,使代碼看起來更加的簡潔。這篇就記錄下和集合轉換相關的吧。。。。。會持續記錄。。。。數據結構

list轉map

開發過程當中常常會碰到須要將list轉爲map的狀況,例若有一個User類,有id,name,age等屬性。有一個User的list,爲了很方便的獲取指定id的User,這時就須要將List< User>轉換爲Map<Integer,User>,其中map的key是User的id。
通常的作法,是經過for循環將list中的元素put到map中,代碼以下:app

Map<Integer, User> map = new HashMap<Integer, User>();
for(User user : userList){
    map.put(user.getId(), user);
}

這樣作,在每一個須要將list轉爲map的地方,都要寫一遍for循環,代碼不夠簡潔,因此利用stream和泛型封裝了一個通用的工具方法工具

public class TransFormUtils {
    
    /**
     * 將list轉爲map
     * @param list
     * @param predicate1  key
     * @param predicate2  value
     * @return
     */
    public static<K,V,T>  Map<K, V> transformToMap(List<T> list,Function<T, K> predicate1, Function<T,V> predicate2){
        return list.stream().collect(Collectors.toMap(predicate1, predicate2));
    }

}

這樣若是須要將List< User>轉爲Map<Integer,User>代碼以下code

//省略list構造過程
Map<Integer, User> map = TransFormUtils.transformToMap(userList, p->p.getId(), p->p);

若是須要將List< User>轉爲Map<Integer,String(用戶名)>代碼以下orm

//省略list構造過程
Map<Integer, String> map2 = TransFormUtils.transformToMap(userList, p->p.getId(), p->p.getName());

應用封裝好的工具類 只須要一行代碼就能夠完成list到map的轉換,程序簡單了許多~~開發

list< T >轉map< K,List< V>>

將開發中常常須要根據list中的某個屬性將list分類。舉個例子,在開發通知中心時須要給用戶推送消息,安卓和ios是調用的不一樣的第三方庫,因此要根據設備的類型調用不一樣的方法。首先根據要推送的用戶Id列表得到List< DeviceUser>,DeviceUser類的屬性包括devicetype,deviceId,userId,userName,createAt等。接着要得到deviceType是ios的deviceId列表,deviceType是安卓的deviceId列表。即將List< DeviceUser>轉爲Map< Integer,List< String>>,其中map的key是deviceType,value是deviceId的list。
爲了解決這個問題,寫了一個通用的工具類。
1.利用streamget

public class TransFormUtils {
    /**
     * 將list<T>轉爲Map<K,List<V>>
     * @param list
     * @param predicate1 map中的key
     * @param predicate2 map中的list的元素
     * @return
     */
    public static <K,V,T> Map<K, List<V>> transformToMapList(List<T> list, Function<T, K> predicate1, Function<T,V> predicate2){
        return list.stream().collect(
                Collectors.groupingBy(predicate1, 
                Collectors.mapping(predicate2, 
                        Collectors.toList())));
    }

}

使用以下:博客

List<DeviceUser> list = new ArrayList<DeviceUser>();
//省略list的構造
Map<Integer, List<String>> deviceMap = TransFormUtils.transformToMapList(list, p->p.getDeviceType(), p->p.getDeviceId());

2.普通方法
同事也寫了一個另外一個工具類,這種方法定義了一個新的數據結構,直接使用MapList代替Mapio

/**
 * Map&List組合數據結構
 * 
 * @author jianming.zhou
 *
 * @param <K>
 * @param <V>
 */
public class MapList<K, V> {

    private Map<K, List<V>> map = new HashMap<K, List<V>>();
    
    public List<V> get(K k) {
        return map.get(k);
    }
    
    public void put(K k, V v) {
        if (map.containsKey(k)) {
            map.get(k).add(v);
        } else {
            List<V> list = new ArrayList<V>();
            list.add(v);
            map.put(k, list);
        }
    }
    
    public Set<K> keySet() {
        return map.keySet();
    }
}

使用以下

List<DeviceUser> list = new ArrayList<DeviceUser>();
//省略list的構造
MapList<Integer, List<String>> deviceMap = new MapList<Integer,List< String>>();
for(DeviceUser device : list){
 deviceMap.put(device.getDeviceType(),device.getDeviceId());
}

仍是喜歡第一種哈哈哈哈哈哈~~題外話:既然對現狀不滿意 就嘗試改變吧 雖然有可能進入另外一個坑~~

相關文章
相關標籤/搜索