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

这篇具有很好参考价值的文章主要介绍了List 转换 Map,三大类,7种方法-非常详细,学会再也不担心这类问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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<Person> 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<Person> personList) {
    Map<String, Person> personMap = new HashMap<>();
    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
 */
private void guava2map(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
 */
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);
}

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);
// key 重复, 没有处理 value 的策略, 异常 java.lang.IllegalStateException: Duplicate key 小A
Map<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 = 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文章来源地址https://www.toymoban.com/news/detail-857443.html

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);
// value 如果为空, NPE
Map<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 可能是空集合, 但不是 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]}
策略二 过滤: 排除 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 转换 Map,三大类,7种方法-非常详细,学会再也不担心这类问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java将一个list<T>指定key转换成Map<list>

    经常有这种,一个数据库里有多个字段,但是数据库只能返回一个list,你group分组了也没用。 然后你得到的是一个list,你想根据type分组,大概是这样 [ {\\\"name\\\":\\\"牛奶\\\",\\\"desc\\\":\\\"吃了有力气\\\",\\\"type\\\":\\\"食物\\\"}, {\\\"name\\\":\\\"猫耳朵\\\",\\\"desc\\\":\\\"富含丰富油脂\\\",\\\"type\\\":\\\"食物\\\"}, {\\\"name\\\":\\\"电脑\\\",\\\"desc\\\":\\\"可以提升

    2024年01月24日
    浏览(54)
  • JAVA对象、List、Map和JSON之间的相互转换

    参考文章: Java-json相关转换,JSONObject与实体类/map互转、List/List<map>和JSONArray互转、获取JSONObject中的key value、字符串String转换等 【JSON转换】String与JSONObject、JSONArray、JAVA对象和List 的相互转换

    2024年02月03日
    浏览(64)
  • Java-json相关转换,JSONObject与实体类/map互转、List/List<map>和JSONArray互转、获取JSONObject中的key value、字符串String转换等

    博客背景是Java开发。json相关的转换、取值等在日常开发中经常使用,但有时候还是会忘记or遇到些奇奇怪怪的问题。以此记录,提醒自己~不定期更新~ 实体类和JSONObject互转 Map和JSONObject互转 String转JSONObject 实体类转JSON字符串时不过滤NULL空值 获取JSONObject中的key value List和

    2024年02月12日
    浏览(81)
  • <Java工具类>json字符串、List Map,List 对象转换为相应的JavaBean对象

    依赖: 工具类(直接上代码): 使用场景: (1).使用泛型方法:把json字符串转换为相应的JavaBean对象 ; 一般用于:Controller层: 例如: (2).List Map转换List 对象:如List,将第二个参数传递为Student对象; (3).List 对象转换List Map:

    2024年02月12日
    浏览(65)
  • Java 把 Map 的值(Value)转换为 Array, List 或 Set

    在这篇短文中,我们将会展示如何把 Map 中的值取出来,转换为一个 Array, 、 List 或者一个 Set 。 当然,你可以使用 Java JDK 来进行转换,你也可以使用 Guava 来进行转换。 首先,让我们来看看,如何使用原生的 Java JDK把一个 Map 的值换行为 Array。 在上面的代码中,我们使用了

    2023年04月23日
    浏览(50)
  • java 对象list使用stream根据某一个属性转换成map的几种方式

    可以使用Java 8中的Stream API将List转换为Map,并根据某个属性作为键或值。以下是一些示例代码: 在这个示例中,将Person对象列表转换为Map,其中键为Person对象的name属性,值为Person对象本身。 在这个示例中,将Person对象列表转换为Map,其中键为Person对象本身,值为Person对象的

    2024年02月13日
    浏览(65)
  • JSON转换:实体类和JSONObject互转,List和JSONArray互转,map和JSONObject,JSONarray互转(fastjson版)

    1.实体类和JSONObject互转 2.List和JSONArray互转 3.Map和JSONObject互转(同1.) 4.ListMap和JSONArray互转(同2.) 5.取数据 6.JSONArray转String{} 7.数组转jsonarry 注: 由上示例可知任意数据类型均可通过JSON.toJSON(xxx)转换成对应的JSONObject或JSONArray

    2024年01月19日
    浏览(54)
  • Flutter中Map、List数组的常用方法

    Dart语言是Flutter开发的必备语言,官方地址如下:Dart:https://dart.cn/ 使用dart工具来运行这些常用的方法,工具:https://dartpad.cn 在Dart中,Map用来存储对像类型的数据,List与Set用来存储数组类型的数据。 Map的创建实例如下: 创建有一个有初始值的Map,代码如下: 根据List数据来

    2024年02月08日
    浏览(48)
  • 如何把pdf转成cad版本?这种转换方法非常简单

    将PDF转换成CAD格式的优势在于,CAD格式通常是用于工程设计和绘图的标准格式。这种格式的文件可以在计算机上进行编辑和修改,而不需要纸质副本。此外,CAD文件通常可以与其他CAD软件进行交互,从而使得工程设计和绘图过程更加高效和精确。那么怎么转换呢?教大家一种

    2024年02月14日
    浏览(48)
  • 判断List、Map集合是否为空的方法

    1.判断List集合是否为空 1.1List集合已经完成初始化  这里的List集合已经完成了初始化操作,相当于是一个瓶子可以装水了,但是此时还没有水。  控制台输出:List is empty.  1.2List集合未完成初始化  这里的List集合,还没有进行初始化,相当于瓶子还不存在,用list.isEmpty()会产

    2024年02月15日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包