在项目上经常遇到将对象集合中的对象某两个属性取出来,形成map对应关系的情况,例如存在猫咪集合如下
List<Cat> list = new ArrayList<>();
list.add(new Cat("11","金渐层","小白"));
list.add(new Cat("12","金渐层","小黄"));
list.add(new Cat("13","银渐层","小蓝"));
list.add(new Cat("14","银渐层","小绿"));
现要获取猫咪品种和名字的对应关系集合,用lambda实现起来很简单,但需要注意集合中的猫咪品种是重复的,所以需要对重复key进行处理,通常有如下三种处理方式
1、重复键对应的后值覆盖前值
Map<String, String> map = list.stream().collect(Collectors.toMap(Cat:: getCatBreed, Cat::getCatName, (key1 , key2)-> key2 ));
// 输出如下:
// {金渐层=小黄, 银渐层=小绿}
2、重复键对应的值拼接成字符串
Map<String, String> map = list.stream().collect(Collectors.toMap(Cat:: getCatBreed, Cat::getCatName, (key1 , key2)-> key1 + "," + key2));
// 输出如下:
// {金渐层=小白,小黄, 银渐层=小蓝,小绿}
3、重复键对应的值组成集合
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Student :: getCatBreed,
cat -> {
List<String> catNameList = new ArrayList<>();
catNameList.add(cat.getCatName());
return catNameList;
},
(List<String> value1, List<String> value2) -> {
value1.addAll(value2);
return value1;
}
));
// 输出如下:
// {金渐层=[小白,小黄], 银渐层=[小蓝,小绿]}