当前位置:   article > 正文

List 转换 Map,三大类,7种方法-非常详细,学会再也不担心这类问题_list转map

list转map

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.personList

List<Person> personList = new ArrayList<>();
personList.add(new Person("1001", "张三"));
personList.add(new Person("1002", "李四"));
System.out.println("personList:" + personList);
  • 1
  • 2
  • 3
  • 4

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

/**
 * 使用传统 for 循环的方法
 * @param personList 原list
 */
private void listForToMap(List<Person> personList) {
    Map<String, Person> personMap = new HashMap<>();
    for (Person person : personList) {
       personMap.put(person.getPersonNo(), person);
    }
    System.out.println("listForToMap:" + personMap);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

二、使用guava 工具类库

先在pom.xml 引入 guava的依赖	
		<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>32.0.1-jre</version>
        </dependency>

/**
 * 使用guava 工具类库
 * @param personList    原list
 */
private void guava2map(List<Person> personList) {
    // person -> person.getUserId() 是对接口方法的实现
    Map<String, Person> personMap = Maps.uniqueIndex(personList, person -> person.getPersonNo());
    System.out.println("guava2map:" + personMap);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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

1.基本用法

/**
 *  java8 新特性流
 * @param personList    原list
 */
private void stream2map(List<Person> personList) {
    Map<String, Person> personMap = personList.stream().collect(Collectors.toMap(person -> person.getPersonNo(), Function.identity()));
    //等价于下面这种写法
    //Map<String, Person> personMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo, t->t));
    System.out.println("stream2map" + personMap);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

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

1)原list有重复的key

数据准备:personList

List<Person> 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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
// key 重复, 没有处理 value 的策略, 异常 java.lang.IllegalStateException: Duplicate key 小A
Map<String, String> no2NameMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo, Person::getName));
  • 1
  • 2
策略一 重复时 用后面的value 覆盖前面的value
Map<String, String> no2NameMap = personList.stream()
       .collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v2));
System.out.println("keyDuplicate: " + no2NameMap); //{1003=小C, 1001=小D}
  • 1
  • 2
  • 3
策略二 将前面的value 和后面的value拼接起来
Map<String, String> 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}
  • 1
  • 2
  • 3
策略三 重复时将重复key的数据组成集合
Map<String, List<String>> no2NameListMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo
				, person -> {
					List<String> 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]}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
2)原list有null值的value

数据准备:personList

List<Person> 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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
// value 如果为空, NPE
Map<String, String> no2NameMap = personList.stream()
       .collect(Collectors.toMap(Person::getPersonNo, Person::getName, (v1, v2) -> v2));
System.out.println("valueNull: " + no2NameMap);
  • 1
  • 2
  • 3
  • 4
策略一 重复时将重复key的数据组成集合
//此时 value 是 List<String> personNameList 可能是空集合, 但不是 null
		Map<String, List<String>> no2NameListMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo
				, person -> {
					List<String> 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]}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
策略二 过滤: 排除 value 是null的数据
Map<String, String> 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}
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/927958
推荐阅读
相关标签
  

闽ICP备14008679号