Java8新特性Stream之list转map

一、list中取map的一个key对应的数据,拼接起来。

String nameStr=list.stream()
            .map(Person::getName)
            .collect(Collectors.joining(","));
System.out.println("nameStr==="+nameStr);

//结果:
nameStr===kiki,dora,fred

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


具体用法实例如下:

//声明一个List集合
List list = new ArrayList();  
        list.add(new Person("11", "kiki"));  
        list.add(new Person("22", "dora"));  
        list.add(new Person("33", "fred"));
        System.out.println(list);
//将list转换map
Map map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
        System.out.println(map);

//输出结果为:
{11=kiki, 22=dora, 33=fred}

注意:用Collectors的toMap方法转换List,一般会遇到两个问题。

一个是转换map,key重复问题;

另一个是空指针异常,即转为map的value是null。


一、第一种问题报的错误如下:Duplicate key

解决方法:(分三种,具体哪种看业务需求)


1.重复时用后面的value 覆盖前面的value

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

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

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

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

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

二、第二种问题报的错误如下:NullPointerException

原因是声明List集合时有的值为空(如图),但是HashMap中k,v是可以存null值的。

解决方法:在转换流中加上判空,即便value为空,依旧输出。(与上面方法三相同)

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

你可能感兴趣的:(java8,java)