博客搬移到這裏:http://yemengying.com/
有個本身的博客還蠻好玩的,bazinga!ios
記錄一下在工做開發中封裝的一些工具類,使代碼看起來更加的簡潔。這篇就記錄下和集合轉換相關的吧。。。。。會持續記錄。。。。數據結構
開發過程當中常常會碰到須要將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中的某個屬性將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()); }
仍是喜歡第一種哈哈哈哈哈哈~~題外話:既然對現狀不滿意 就嘗試改變吧 雖然有可能進入另外一個坑~~