溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解Java8新特性Stream之list轉map及問題解決

發(fā)布時間:2020-08-21 14:50:16 來源:腳本之家 閱讀:974 作者:菜鳥驛站 欄目:編程語言

List集合轉Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap

具體用法實例如下:

//聲明一個List集合
List<Person> list = new ArrayList(); 
  list.add(new Person("1001", "小A")); 
  list.add(new Person("1002", "小B")); 
  list.add(new Person("1003", "小C"));
  System.out.println(list);
//將list轉換map
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
  System.out.println(map);

輸出結果為:

詳解Java8新特性Stream之list轉map及問題解決

注意:用Collectors的toMap方法轉換List,一般會遇到兩個問題。一個是轉換map,key重復問題;另一個是空指針異常,即轉為map的value是null。

問題解決?。?!

一、第一種問題報的錯誤如下:Duplicate key

詳解Java8新特性Stream之list轉map及問題解決

原因是聲明List集合時,有的值重復,如圖:

詳解Java8新特性Stream之list轉map及問題解決

解決方法:(分三種,具體哪種看業(yè)務需求)

1.重復時用后面的value 覆蓋前面的value

Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key2 ));
  System.out.println(map); 

輸出結果:

詳解Java8新特性Stream之list轉map及問題解決

2.重復時將前面的value 和后面的value拼接起來;

Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key1+","+key2 ));
  System.out.println(map);

輸出結果:

詳解Java8新特性Stream之list轉map及問題解決

3.重復時將重復key的數(shù)據(jù)組成集合

Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Person::getId,
	 		p -> {
	 		 	List<String> getNameList = new ArrayList<>();
	 		 		getNameList.add(p.getName());
	 		 		return getNameList;
	 		 	},
 		  	(List<String> value1, List<String> value2) -> {
 		  		value1.addAll(value2);
 		  		return value1;
 		  	}
	 		 ));
  
   System.out.println(map);

輸出結果:

詳解Java8新特性Stream之list轉map及問題解決

二、第二種問題報的錯誤如下:NullPointerException

詳解Java8新特性Stream之list轉map及問題解決

原因是聲明List集合時有的值為空(如圖),但是HashMap中k,v是可以存null值的。

詳解Java8新特性Stream之list轉map及問題解決

解決方法:在轉換流中加上判空,即便value為空,依舊輸出。(與上面方法三相同)

Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Person::getId,
	 		p -> {
	 		 	List<String> getNameList = new ArrayList<>();
	 		 		getNameList.add(p.getName());
	 		 		return getNameList;
	 		 	},
 		  	(List<String> value1, List<String> value2) -> {
 		  		value1.addAll(value2);
 		  		return value1;
 		  	}
	 		 ))
   System.out.println(map);

輸出結果為:

詳解Java8新特性Stream之list轉map及問題解決

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI