Java中Map轉(zhuǎn)List及List轉(zhuǎn)Map的方法(簡單好用!)
1. Map轉(zhuǎn)List
1.1 將Map的key轉(zhuǎn)換為List
public void testMapToList(){ // 創(chuàng)建一個Map Map<String, Integer> map = new HashMap<>(); map.put("key1", 1); map.put("key2", 2); map.put("key3", 3); // 將Map的key轉(zhuǎn)換為List List<String> keyList = new ArrayList<>(map.keySet()); // 打印結(jié)果 System.out.println(keyList); }
輸出:
[key1, key2, key3]
1.2 將Map的value轉(zhuǎn)換為List
public void testMapToList(){ // 創(chuàng)建一個Map Map<String, Integer> map = new HashMap<>(); map.put("key1", 1); map.put("key2", 2); map.put("key3", 3); // 將Map的value轉(zhuǎn)換為List List<Integer> keyList = new ArrayList<>(map.values()); // 打印結(jié)果 System.out.println(keyList); }
輸出:
[1, 2, 3]
所以說這兩個方法的區(qū)別就是在
new ArrayList<>
時選擇使用map.values()
還是map.keySet()
2. List轉(zhuǎn)Map
2.1 最普通的List轉(zhuǎn)Map
public void testListToMap(){ // 創(chuàng)建一個List List<String> list = new ArrayList<>(); list.add("key1"); list.add("key2"); list.add("key3"); // 將List轉(zhuǎn)換為Map Map<String, Integer> map = list.stream() .collect(Collectors.toMap(key -> key, value -> 0, (v1, v2) -> v1)); // value里默認(rèn)放一個0 // 打印結(jié)果 System.out.println(map); }
輸出:
{key1=0, key2=0, key3=0}
要特別注意里面的
(v1, v2) -> v1)
必須帶上。如果你的key里重復(fù)的時候沒這句話會異常:java.lang.IllegalStateException: Duplicate key 0
(v1, v2) -> v1
表示當(dāng)出現(xiàn)重復(fù)的鍵時,選擇保留原始的值 v1
,而忽略新值 v2
。如果你希望在出現(xiàn)重復(fù)的鍵時采取其他操作,例如取最大值、取最小值或者進(jìn)行求和等操作,您可以在合并函數(shù)中編寫相應(yīng)的邏輯。例如,可以使用(v1, v2) -> Math.max(v1, v2)
來選擇兩個值中的最大值。
2.2 List轉(zhuǎn)Map同時保證順序
假如我的list的放入順序變了:
List<String> list = new ArrayList<>(); list.add("key3"); list.add("key2"); list.add("key1");
用第一個方式得到的Map是亂序的,如果想保證順序,可以借助LinkedHashMap
.
public void testListToMap(){ // 創(chuàng)建一個List List<String> list = new ArrayList<>(); list.add("key3"); list.add("key2"); list.add("key1"); // 將List轉(zhuǎn)換為Map Map<String, Integer> map = list.stream() .collect(Collectors.toMap(key -> key, value -> 0, (v1, v2) -> v1, LinkedHashMap::new)); // value里默認(rèn)放一個0 // 打印結(jié)果 System.out.println(map); }
輸出:
{<!-- -->key3=0, key2=0, key1=0}
2.3 List轉(zhuǎn)Map(對象類型且key拼接)
假如有這個User
:
@Data @AllArgsConstructor @NoArgsConstructor @Builder public static class User{ private Integer id; private String name; private Integer age; }
想要id
拼接_
拼接name
作為key
,age
作為value
,轉(zhuǎn)Map。代碼:
public void testListToMap2() { // 創(chuàng)建一個List List<User> list = new ArrayList<>(); list.add(new User(1,"Tom",10)); list.add(new User(2,"Tim",10)); list.add(new User(3,"Jim",10)); // 將List轉(zhuǎn)換為Map Map<String, Integer> map = list.stream() .collect(Collectors.toMap(key -> key.getId()+"_"+key.getName(), value -> value.getAge(), (v1, v2) -> v1)); System.out.println(JSON.toJSON(map)); }
輸出:
{"3_Jim":10,"2_Tim":10,"1_Tom":10}
2.4 List轉(zhuǎn)Map(id作為key,每個元素作為value)
public void testListToMap2() { // 創(chuàng)建一個List List<User> list = new ArrayList<>(); list.add(new User(1,"Tom",10)); list.add(new User(2,"Tim",10)); list.add(new User(3,"Jim",10)); // 將List轉(zhuǎn)換為Map Map<Integer, User> map = list.stream() .collect(Collectors.toMap(User::getId, value -> value, (v1, v2) -> v1)); System.out.println(JSON.toJSON(map)); }
輸出:
{
"1": {
"name": "Tom",
"id": 1,
"age": 10
},
"2": {
"name": "Tim",
"id": 2,
"age": 10
},
"3": {
"name": "Jim",
"id": 3,
"age": 10
}
}
完結(jié)撒花~
總結(jié)
到此這篇關(guān)于Java中Map轉(zhuǎn)List及List轉(zhuǎn)Map的文章就介紹到這了,更多相關(guān)Java Map和List互選轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java狀態(tài)機(jī)的一種優(yōu)雅寫法分享
狀態(tài)機(jī)是一種數(shù)學(xué)模型,對于我們業(yè)務(wù)實現(xiàn)有很大的幫助。我們可以用非常多的方法實現(xiàn)狀態(tài)機(jī),這篇文章就來介紹一個狀態(tài)機(jī)優(yōu)雅的實現(xiàn)方法,希望對大家有所幫助2023-04-04JDK8接口的默認(rèn)與靜態(tài)方法-接口與抽象類的區(qū)別詳解
這篇文章主要介紹了JDK8接口的默認(rèn)與靜態(tài)方法-接口與抽象類的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下2019-06-06JAVA正則表達(dá)式提取key-value類型字符值代碼實例
這篇文章主要給大家介紹了關(guān)于JAVA正則表達(dá)式提取key-value類型字符值的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-10-10