测试代码如下:
public class StreamUtil {
public static void main(String[] args) {
//List集合
List<Test> list = new ArrayList();
list.add(new Test("01", "A"));
list.add(new Test("02", "B"));
list.add(new Test("02", "c"));
System.out.println(list);
//list转换map
//Map<String, Test> map = list.stream().collect(Collectors.toMap(Test::getId, p -> p));
// Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName));
// Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName,(key1 , key2)-> key2 ));
Map<String, Test> map = list.stream().collect(Collectors.toMap(Test::getId, a -> a,(k1,k2)->k1));
Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName, (key1, key2) -> key1 + "," + key2));
/*Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Test::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("list转换map:" + map);
System.out.println("list转换map:" + map.get("02"));
System.out.println(Arrays.asList(map.get("02").split(",")));
}
public static class Test {
String id;
String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Test() {
super();
}
public Test(String id, String name) {
this.id = id;
this.name = name;
}
}
}
结果:
list转换map:{01=A, 02=B}
此时list中再加入重复的数据则会报错
list.add(new Test("02", "B"));
list.add(new Test("02", "C"));
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xozdAvDi-1624699037760)(http://www.niuhaha.monster:8090/upload/2021/04/image-3f9ac556641c4cbf91297c3e03916680.png)]
解决:
1.重复时用后面的value 覆盖前面的value
Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName,(key1 , key2)-> key2 ));
list转换map:{01=A, 02=C}
2.重复时将前面的value 和后面的value拼接起来
Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName,(key1 , key2)-> key1+","+key2 ));
list转换map:{01=A, 02=B,C}
3.重复时将重复key的数据组成集合
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Test::getId,
p -> {
List<String> getNameList = new ArrayList<>();
getNameList.add(p.getName());
return getNameList;
},
(List<String> value1, List<String> value2) -> {
value1.addAll(value2);
return value1;
}
));
list转换map:{01=[A], 02=[B, c]}
或者将2中结果提取出来按“,”截取成集合也可.