JDK8特性--Stream(求和,过滤,排序) 这里是其他一些stream的有用法,有需要的可以看看。
言归正传,现在主要是是学习list转map,使用的方法是Stream中Collectors的toMap方法:Collectors.toMap。
首先我们构造一个list
//声明一个List集合
List<People> list = new ArrayList();
list.add(new People("小A", "数学"));
list.add(new People("小B", "语文"));
list.add(new People("小C", "英语"));
System.out.println(list.toString());
//将list转换map
打印结果如下
1.普通转换
Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse));
System.out.println(map);
打印结果如下
2.有相同key时,会报错
同样构建一个list
//声明一个List集合
List<People> list = new ArrayList();
list.add(new People("小A", "数学"));
list.add(new People("小B", "语文"));
list.add(new People("小C", "英语"));
list.add(new People("小C", "历史")); //新增行
System.out.println(list.toString());
list打印如下:
这样如果还如上面的转化 。
会报错,错误如下:
解决办法:
2.1 留下一个
//将list转换map,->箭头后的值是当遇到相同时,留下第一个还是第二个
Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse,(key1 , key2)-> key2 ));
System.out.println(map);
打印如下:
2.2重复时将前面的value 和后面的value拼接起来
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key1+","+key2 ));
System.out.println(map);
打印结果如下:
2.3 重复时将重复key的数据组成集合
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(People::getName,
p -> {
List<String> getNameList = new ArrayList<>();
getNameList.add(p.getCourse());
return getNameList;
},
(List<String> value1, List<String> value2) -> {
value1.addAll(value2);
return value1;
}
));
System.out.println(map);
打印结果如下:
3.字段为空的情况,会出现空指针异常。
构建一个list,普通转换
//声明一个List集合
List<People> list = new ArrayList();
list.add(new People("小A", "数学"));
list.add(new People("小B", "语文"));
list.add(new People("小C", null));
System.out.println(list.toString());
//将list转换map,->箭头后的值是当遇到相同时,留下第一个还是第二个
Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse));
System.out.println(map);
报错如下:
3.1解决办法如下:
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(People::getName,
p -> {
List<String> getNameList = new ArrayList<>();
getNameList.add(p.getCourse());
return getNameList;
},
(List<String> value1, List<String> value2) -> {
value1.addAll(value2);
return value1;
}
));
System.out.println(map);
打印结果如下: