部落格搬移到這裡:http://yemengying.com/
有個自己的部落格還蠻好玩的,bazinga!
記錄一下在工作開發中封裝的一些工具類,使程式碼看起來更加的簡潔。這篇就記錄下和集合轉換相關的吧。。。。。會持續記錄。。。。
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中,程式碼如下:
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>程式碼如下
//省略list構造過程
Map<Integer, User> map = TransFormUtils.transformToMap(userList, p->p.getId(), p->p);
如果需要將List< User>轉為Map<Integer,String(使用者名稱)>程式碼如下
//省略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.利用stream
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代替Map
/**
* 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());
}
還是喜歡第一種哈哈哈哈哈哈~~
題外話:既然對現狀不滿意 就嘗試改變吧 雖然有可能進入另一個坑~~