在實際項目中我們經常會用到 List 轉 Map 操作,在過去我們可能使用的是 for 循環遍歷的方式。舉個例子:
先定義類:
1 |
// 簡單對象 |
然后有這樣一個 List:
1 |
List<User> userList = Lists.newArrayList( |
我們希望轉成 Map 的格式為:
1 |
A-> 張三 |
過去的做法(循環):
1 |
Map<String, String> map = new HashMap<>(); |
使用 Java8 特性
Java8 中新增了 Stream 特性,使得我們在處理集合操作時更方便了。
以上述例子為例,我們可以一句話搞定:
1 |
userList.stream().collect(Collectors.toMap(User::getId, User::getName)); |
當然,如果希望得到 Map 的 value 為對象本身時,可以這樣寫:
1 |
userList.stream().collect(Collectors.toMap(User::getId, t -> t)); |
關於 Collectors.toMap 方法
Collectors.toMap 有三個重載方法:
1 |
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper); |
參數含義分別是:
-
keyMapper:Key 的映射函數
-
valueMapper:Value 的映射函數
-
mergeFunction:當 Key 沖突時,調用的合並方法
-
mapSupplier:Map 構造器,在需要返回特定的 Map 時使用
還是用上面的例子,如果 List 中 userId 有相同的,使用上面的寫法會拋異常:
1 |
List<User> userList = Lists.newArrayList( |
這時就需要調用第二個重載方法,傳入合並函數,如:
1 |
userList.stream().collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1 + n2)); |
第四個參數(mapSupplier)用於自定義返回 Map 類型,比如我們希望返回的 Map 是根據 Key 排序的,可以使用如下寫法:
1 |
List<User> userList = Lists.newArrayList( |
