zoukankan      html  css  js  c++  java
  • Stream之list转map及问题解决

    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);
    

    image

    注意:用Collectors的toMap方法转换List,一般会遇到两个问题。一个是转换map,key重复问题;另一个是空指针异常,即转为map的value是null。
    问题解决!!!
    一、第一种问题报的错误如下:Duplicate key

    原因是声明List集合时,有的值重复,如图:
    image
    解决方法:(分三种,具体哪种看业务需求)
    1.重复时用后面的value 覆盖前面的value

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

    image

    2.重复时将前面的value 和后面的value拼接起来;

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

    输出结果:
    image

    3.重复时将重复key的数据组成集合

    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);
    
    

    输出结果:
    image

    二、第二种问题报的错误如下:NullPointerException
    原因是声明List集合时有的值为空(如图),但是HashMap中k,v是可以存null值的。

     list.add(new Person("1001", "小A"));  
     list.add(new Person("1002", "小B"));  
     list.add(new Person("1003", "小C"));
     list.add(new Person("1004", null)); 
    

    解决方法:在转换流中加上判空,即便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);
    

    输出结果为:
    image

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/xiaoyuicom/p/15386981.html
Copyright © 2011-2022 走看看