文章目录

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 = new ArrayList<>();

personList.add(new Person("1001", "张三"));

personList.add(new Person("1002", "李四"));

System.out.println("personList:" + personList);

一、使用传统 for 循环的方法

/**

* 使用传统 for 循环的方法

* @param personList 原list

*/

private void listForToMap(List personList) {

Map personMap = new HashMap<>();

for (Person person : personList) {

personMap.put(person.getPersonNo(), person);

}

System.out.println("listForToMap:" + personMap);

}

二、使用guava 工具类库

先在pom.xml 引入 guava的依赖

com.google.guava

guava

32.0.1-jre

/**

* 使用guava 工具类库

* @param personList 原list

*/

private void guava2map(List personList) {

// person -> person.getUserId() 是对接口方法的实现

Map personMap = Maps.uniqueIndex(personList, person -> person.getPersonNo());

System.out.println("guava2map:" + personMap);

}

三、使用Java8新特性Stream的Collectors类

1.基本用法

/**

* java8 新特性流

* @param personList 原list

*/

private void stream2map(List personList) {

Map personMap = personList.stream().collect(Collectors.toMap(person -> person.getPersonNo(), Function.identity()));

//等价于下面这种写法

//Map personMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo, t->t));

System.out.println("stream2map" + personMap);

}

2.转换过程中会存在的两个问题

Map的value不是Person对象,而是Person的成员变量。

1)原list有重复的key

数据准备:personList

List personList = new ArrayList<>();

// 小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 no2NameMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo, Person::getName));

策略一 重复时 用后面的value 覆盖前面的value

Map no2NameMap = personList.stream()

.collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v2));

System.out.println("keyDuplicate: " + no2NameMap); //{1003=小C, 1001=小D}

策略二 将前面的value 和后面的value拼接起来

Map no2NameMap2 = personList.stream()

.collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v1 + "," + v2));

System.out.println("keyDuplicate2: " + no2NameMap2);//{1003=小C, 1001=小A,小B,小D}

策略三 重复时将重复key的数据组成集合

Map> no2NameListMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo

, person -> {

List personNameList = new ArrayList<>();

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 personList = new ArrayList<>();

// 小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 no2NameMap = personList.stream()

.collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v2));

System.out.println("valueNull: " + no2NameMap);

策略一 重复时将重复key的数据组成集合

//此时 value 是 List personNameList 可能是空集合, 但不是 null

Map> no2NameListMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo

, person -> {

List personNameList = new ArrayList<>();

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 no2NameMap = personList.stream().filter(person -> null != person.getName())

.collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v1 + "," + v2));

System.out.println("valueNull4: " + no2NameMap);//{1001=小A,小D}

相关文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。