0


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

文章目录

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

数据准备:

1.pojo对象

@DatapublicclassPerson{privateString personNo;privateString name;publicPerson(String personNo,String name){this.personNo = personNo;this.name = name;}}

2.personList

List<Person> personList =newArrayList<>();
personList.add(newPerson("1001","张三"));
personList.add(newPerson("1002","李四"));System.out.println("personList:"+ personList);

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

/**
 * 使用传统 for 循环的方法
 * @param personList 原list
 */privatevoidlistForToMap(List<Person> personList){Map<String,Person> personMap =newHashMap<>();for(Person person : personList){
       personMap.put(person.getPersonNo(), person);}System.out.println("listForToMap:"+ personMap);}

二、使用guava 工具类库

先在pom.xml 引入 guava的依赖    
        <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.0.1-jre</version></dependency>/**
 * 使用guava 工具类库
 * @param personList    原list
 */privatevoidguava2map(List<Person> personList){// person -> person.getUserId() 是对接口方法的实现Map<String,Person> personMap =Maps.uniqueIndex(personList, person -> person.getPersonNo());System.out.println("guava2map:"+ personMap);}

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

1.基本用法

/**
 *  java8 新特性流
 * @param personList    原list
 */privatevoidstream2map(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);}

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

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

1)原list有重复的key

数据准备:personList

List<Person> personList =newArrayList<>();// 小A和小B key重复
personList.add(newPerson("1001","小A"));
personList.add(newPerson("1001","小B"));
personList.add(newPerson("1001","小D"));
personList.add(newPerson("1003","小C"));System.out.println(personList);
// key 重复, 没有处理 value 的策略, 异常 java.lang.IllegalStateException: Duplicate key 小AMap<String,String> no2NameMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo,Person::getName));
策略一 重复时 用后面的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}
策略二 将前面的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}
策略三 重复时将重复key的数据组成集合
Map<String,List<String>> no2NameListMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo, person ->{List<String> personNameList =newArrayList<>();
                    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<Person> personList =newArrayList<>();// 小A和小B key重复
personList.add(newPerson("1001","小A"));
personList.add(newPerson("1001",null));
personList.add(newPerson("1001","小D"));
personList.add(newPerson("1003",null));System.out.println(personList);
// value 如果为空, NPEMap<String,String> no2NameMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo,Person::getName,(v1, v2)-> v2));System.out.println("valueNull: "+ no2NameMap);
策略一 重复时将重复key的数据组成集合
//此时 value 是 List<String> personNameList 可能是空集合, 但不是 nullMap<String,List<String>> no2NameListMap = personList.stream().collect(Collectors.toMap(Person::getPersonNo, person ->{List<String> personNameList =newArrayList<>();
                    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<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}
标签: list java java-ee

本文转载自: https://blog.csdn.net/m0_51539432/article/details/135587899
版权归原作者 glProgramming 所有, 如有侵权,请联系我们删除。

“List 转换 Map,三大类,7种方法-非常详细,学会再也不担心这类问题”的评论:

还没有评论