文章目录
List 转换 Map,三大类,7种方法-非常详细,学会再也不担心这类问题一、使用传统 for 循环的方法二、使用guava 工具类库三、使用Java8新特性Stream的Collectors类1.基本用法2.转换过程中会存在的两个问题1)原list有重复的key策略一 重复时 用后面的value 覆盖前面的value策略二 将前面的value 和后面的value拼接起来策略三 重复时将重复key的数据组成集合
2)原list有null值的value策略一 重复时将重复key的数据组成集合策略二 过滤: 排除 value 是null的数据
List 转换 Map,三大类,7种方法-非常详细,学会再也不担心这类问题
数据准备:
1.pojo对象
@Data
public class Person {
private String personNo;
private String name;
public Person(String personNo, String name) {
this.personNo = personNo;
this.name = name;
}
}
2.personList
List
personList.add(new Person("1001", "张三"));
personList.add(new Person("1002", "李四"));
System.out.println("personList:" + personList);
一、使用传统 for 循环的方法
/**
* 使用传统 for 循环的方法
* @param personList 原list
*/
private void listForToMap(List
Map
for (Person person : personList) {
personMap.put(person.getPersonNo(), person);
}
System.out.println("listForToMap:" + personMap);
}
二、使用guava 工具类库
先在pom.xml 引入 guava的依赖
/**
* 使用guava 工具类库
* @param personList 原list
*/
private void guava2map(List
// person -> person.getUserId() 是对接口方法的实现
Map
System.out.println("guava2map:" + personMap);
}
三、使用Java8新特性Stream的Collectors类
1.基本用法
/**
* java8 新特性流
* @param personList 原list
*/
private void stream2map(List
Map
//等价于下面这种写法
//Map
System.out.println("stream2map" + personMap);
}
2.转换过程中会存在的两个问题
Map的value不是Person对象,而是Person的成员变量。
1)原list有重复的key
数据准备:personList
List
// 小A和小B key重复
personList.add(new Person("1001", "小A"));
personList.add(new Person("1001", "小B"));
personList.add(new Person("1001", "小D"));
personList.add(new Person("1003", "小C"));
System.out.println(personList);
// key 重复, 没有处理 value 的策略, 异常 java.lang.IllegalStateException: Duplicate key 小A
Map
策略一 重复时 用后面的value 覆盖前面的value
Map
.collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v2));
System.out.println("keyDuplicate: " + no2NameMap); //{1003=小C, 1001=小D}
策略二 将前面的value 和后面的value拼接起来
Map
.collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v1 + "," + v2));
System.out.println("keyDuplicate2: " + no2NameMap2);//{1003=小C, 1001=小A,小B,小D}
策略三 重复时将重复key的数据组成集合
Map
, person -> {
List
personNameList.add(person.getName());
return personNameList;
}, (v1, v2) -> {
v1.addAll(v2);
return v1;
}));
System.out.println("keyDuplicate3: " + no2NameListMap);//{1003=[小C], 1001=[小A, 小B, 小D]}
2)原list有null值的value
数据准备:personList
List
// 小A和小B key重复
personList.add(new Person("1001", "小A"));
personList.add(new Person("1001", null));
personList.add(new Person("1001", "小D"));
personList.add(new Person("1003", null));
System.out.println(personList);
// value 如果为空, NPE
Map
.collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v2));
System.out.println("valueNull: " + no2NameMap);
策略一 重复时将重复key的数据组成集合
//此时 value 是 List
Map
, person -> {
List
personNameList.add(person.getName());
return personNameList;
}, (v1, v2) -> {
v1.addAll(v2);
return v1;
}));
System.out.println("valueNull3: " + no2NameListMap);//{1003=[null], 1001=[小A, null, 小D]}
策略二 过滤: 排除 value 是null的数据
Map
.collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v1 + "," + v2));
System.out.println("valueNull4: " + no2NameMap);//{1001=小A,小D}
相关文章
发表评论