Java 集合List转 Map 和Map转List的方法总结(举例说明!)

article/2025/8/26 11:27:45

        最近遇到了一个场景是,要将从数据库中查出的List<bean>转换为List<map>然后再取map中的value,最后把所有的value写到Excel中。由于这个bean的属性太多了,我最开始没有采用list转map的方式取获取value,而是在for循环中,写了大量的get方法,导致代码量太高。当然处理这个问题不用poi而选用easyexcel应该是更简单的选择。不过抛开这个不说,虽然走了一些弯路,但List转 Map 和Map转List的方法还是应该总结一下的。

一、List转Map

①、当是list<String>时:(就List内不是存放一个对象时)

比如要实现将从数据库中查出的字符串按照长度进行分组,并返回给前端

(这里我就往list中插入几个数据,进行模拟)

    List<String> list = new ArrayList<>();list.add("hello");list.add("word");list.add("come");list.add("on");list.add("");list.add(" ");list.add(null);for(String s:list){System.out.println(s);}Map<Integer, List<String>> ans = new HashMap<>();for(String str: list) {if(str != null) {  //增加非空判断List<String> sub = ans.get(str.length());if (sub == null) {sub = new ArrayList<>();ans.put(str.length(), sub);}sub.add(str);}}System.out.println(ans);

         当然代码还可以优化一下:(这样的代码简洁性确实提高了,不过代码的可读性不高,实际场景下也不太会这样写)。

for(String str: list) {if(str != null) {  //增加非空判断List<String> sub = ans.computeIfAbsent(str.length(), k -> new ArrayList<>());sub.add(str);}
}

不过还是解释一下这段代码:

computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) 是一个Map的方法,用于计算Map中的Value。 如果Key已经存在,则直接返回对应的Value;如果Key不存在,则使用给定的mappingFunction计算Value并添加到Map中,最后返回Value。 这样做的好处是可以避免手动检查Key是否存在并添加Value,从而简化代码。 因此,List<String> sub = ans.computeIfAbsent(str.length(), k -> new ArrayList<>()); 的意思是: 如果Map中已经包含了指定长度的字符串列表,则直接取出这个列表赋值给sub; 否则就新建一个空列表并把它赋值给sub,并将这个空列表添加到Map中去。

②、当是list<bean>时:(List内是存放一个对象时)

比如要实现将从数据库中查出的对象list,取对象list中的值,并返回给前端

针对这种情况,先创建一个对象

//创建一个list<bean>
List<KeyValue> list33 = new ArrayList<>();
list33.add(new KeyValue(1, "a"));
list33.add(new KeyValue(2, "b"));
list33.add(new KeyValue(3, "c"));
//打印出list<bean>
for(KeyValue item1:list33) {System.out.print(item1+", ");
}
System.out.println("\n***************************"); //换行输出// 遍历
Map<Integer, String> keyValueMap = new HashMap<>();
for (KeyValue keyValue : list33) {keyValueMap.put(keyValue.getKey(), keyValue.getValue());
}
keyValueMap.forEach((k, v) -> System.out.println(k + " ==> " + v));System.out.println("\n***************************"); //换行输出// Java8 Stream
Map<Integer, String> map = list33.stream().collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue));
map.forEach((k, v) -> System.out.println(k + " ==> " + v));

        还可有这种思路写法:(当时这个对象属性太多,实际情况还是不要这样写),写的思路可以简述为:(这其实都可以归到 List<Bean>转List<String>了)将搜索得到的List<Bean>转化为List<Map<String, String>>再转换成一个List<String>。具体来说,首先对于列表中的每个元素,也就是一个Map<String, String>,将其所有的键值对取出来。然后对于每个键值对,即Map.Entry<String, String>,只取它的值,也就是entry.getValue(),并加入valueList中。最终得到的valueList即是所有字符串值的列表。

       // 从数据库ensure表中读取数据List<Salary> userList =  staffMapper.getAllStaff(year, month);log.info("数据为:\n{}", userList);List<Map<String, String>> salaryList = new ArrayList<>();for (Salary salary : userList) {Map<String, String> salaryMap = new LinkedHashMap<>();salaryMap.put("userName", salary.getUserName());salaryMap.put("firstDepart", salary.getFirstDepart());salaryMap.put("secondDepart", salary.getSecondDepart());salaryMap.put("post", salary.getPost());salaryMap.put("idNumber", salary.getIdNumber());salaryMap.put("cardNumber", salary.getCardNumber());salaryMap.put("basicSalary", salary.getBasicSalary());salaryMap.put("rankSalary", salary.getRankSalary());salaryMap.put("performSalary", salary.getPerformSalary());salaryMap.put("subsidy", salary.getSubsidy());salaryMap.put("overtimeDay", salary.getOvertimeDay());salaryMap.put("subsidyMeal", salary.getSubsidyMeal());salaryMap.put("fullDay", salary.getFullDay());salaryMap.put("compassLeave", salary.getCompassLeave());salaryMap.put("sickLeave", salary.getSickLeave());salaryMap.put("actualDay", salary.getActualDay());salaryMap.put("basePay", salary.getBasePay());salaryMap.put("rankPay", salary.getRankPay());salaryMap.put("performPay", salary.getPerformPay());salaryMap.put("performSubsidy", salary.getPerformSubsidy());salaryMap.put("performDeduct", salary.getPerformDeduct());salaryMap.put("illegalDeduct", salary.getIllegalDeduct());salaryMap.put("confidSubsidy", salary.getConfidSubsidy());salaryMap.put("bonus", salary.getBonus());salaryMap.put("fine", salary.getFine());salaryMap.put("totalPay", salary.getTotalPay());salaryMap.put("retire", salary.getRetire());salaryMap.put("medicalLive", salary.getMedicalLive());salaryMap.put("unemploy", salary.getUnemploy());salaryMap.put("housing", salary.getHousing());salaryMap.put("childrenDeduct", salary.getChildrenDeduct());salaryMap.put("educatDeduct", salary.getEducatDeduct());salaryMap.put("housingDeduct", salary.getHousingDeduct());salaryMap.put("rentalDeduct", salary.getRentalDeduct());salaryMap.put("supportDeduct", salary.getSupportDeduct());salaryMap.put("careDeduct", salary.getCareDeduct());salaryMap.put("personalTax", salary.getPersonalTax());salaryMap.put("actualPay", salary.getActualPay());salaryMap.put("socialUnitpart", salary.getSocialUnitpart());salaryMap.put("amonthlySalary", salary.getAmonthlySalary());salaryMap.put("achieveBonus", salary.getAchieveBonus());salaryMap.put("status", Integer.valueOf(103).equals(salary.getStatus()) ? "已确认" : "未确认");salaryMap.put("evidence", salary.getEvidence());salaryList.add(salaryMap);}//取出map键值对中的value值List<String> valueList = new ArrayList<>();for (Map<String, String> salaryMap : salaryList) {Set<Map.Entry<String, String>> entrySet = salaryMap.entrySet();for (Map.Entry<String, String> entry : entrySet) {valueList.add(entry.getValue());}}

 二、Map转List (这里只写了转List<bean>)

Map<Integer, String> map33 = new HashMap<>();
map33.put(1, "a");
map33.put(2, "b");
map33.put(3, "c");// key 转 List
List<Integer> keyList = new ArrayList<>(map33.keySet());
List<Integer> keyList2 = map33.keySet().stream().collect(Collectors.toList());keyList.forEach(System.out::println);
keyList2.forEach(System.out::println);// value 转 List
List<String> valueList = new ArrayList<>(map33.values());
List<String> valueList2 = map33.values().stream().collect(Collectors.toList());valueList.forEach(System.out::println);
valueList2.forEach(System.out::println);// Iterator转List
List<KeyValue> keyValueList = new ArrayList<>();
Iterator<Integer> it = map33.keySet().iterator();
while (it.hasNext()) {Integer k = (Integer) it.next();keyValueList.add(new KeyValue(k, map33.get(k)));
}keyValueList.forEach(System.out::println);// Java8 Stream
List<KeyValue> list = map33.entrySet().stream().map(c -> new KeyValue(c.getKey(), c.getValue())).collect(Collectors.toList());
list.forEach(System.out::println);

如果对map遍历还不是很熟悉的小伙伴可以再复习一下map遍历

Map<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");// Map.keySet遍历
for (Integer k : map.keySet()) {System.out.println(k + " ==> " + map.get(k));
}
System.out.println("\n***************************"); //换行输出map.keySet().forEach(k -> System.out.println(k + " ==> " + map.get(k)));
System.out.println("\n***************************"); //换行输出// Map.entrySet遍历,推荐大容量时使用
for (Map.Entry<Integer, String> entry : map.entrySet()) {System.out.println(entry.getKey() + " ==> " + entry.getValue());
}
System.out.println("\n***************************"); //换行输出map.forEach((key, value) -> System.out.println(key + " ==> " + value));
System.out.println("\n***************************"); //换行输出// Iterator遍历
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {Map.Entry<Integer, String> entry = it.next();System.out.println(entry.getKey() + " ==> " + entry.getValue());
}
System.out.println("\n***************************"); //换行输出map.entrySet().iterator().forEachRemaining(entry -> System.out.println(entry.getKey() + " ==> " + entry.getValue()));
System.out.println("\n***************************"); //换行输出// 遍历values
for (String v : map.values()) {System.out.println(v);
}
System.out.println("\n***************************"); //换行输出map.values().forEach(System.out::println);
System.out.println("\n***************************"); //换行输出// Java8 Lambda
map.forEach((k, v) -> System.out.println(k + " ==> " + v));

 


http://chatgpt.dhexx.cn/article/P6O6UBo0.shtml

相关文章

Java8:list转Map

小故事 最近项目中&#xff0c;因为业务需要&#xff0c;我使用了for循环进行List转Map&#xff0c;项目经理看到了&#xff0c;深深的”鄙视“了我&#xff0c;说你怎么写这么古老的写法&#xff0c;一点不优雅。于是我就想到了Java8的新特性&#xff0c;使用stream流进行操作…

Java8 Stream(11)List转Map

一、前言 对于聚合统计可以参考下面博客。 Java8 Stream&#xff08;12&#xff09;Collectors 分组统计 详解 开发中&#xff0c;List转Map是非常常见的操作&#xff0c;例如&#xff1a; List<T> 转 Map<String, T>List<T> 转 Map<String, List<T&…

APP移动测试用例总结,总有你要用到的

目录 前言 一、首先是测试资源确认及准备 二、测试用例的设计与评审 三、UI测试 四、功能测试 五、中断测试 六、兼容性及适配测试 七、性能测试 八、稳定性测试 九、测试分析及测试报告输出 十、移动端测试用例的实践经验 总结 重点&#xff1a;配套学习资料和…

设计水杯,门锁的测试用例

测试用例公式&#xff1a; 功能测试 界面测试 性能测试 兼容性测试 易用性测试 安全测试 一般用脑图或者Excel来编写测试用例 百度脑图 - 便捷的思维工具 水杯的测试用例&#xff1a; 门锁的测试用例&#xff1a; 测试用例越多越好吗&…

APP 测试用例(大部分 APP 通用)

APP 测试用例 根据 场景设计法 来设计测试用例 安装与卸载权限设置软件更新登录与注册网络环境运行日历控件异常测试兼容性测试

在线音乐播放器测试用例

登录功能测试用例 当用户输入正确的用户名和密码时,方可登录成功,否则,会给出相应得提示。 上传音乐测试用例 用户选择上传的音乐后缀是.mp3时,才能上传成功。 查询音乐测试用例 查询音乐支持指定名称查询和模糊匹配查询。 安全测试 安全测试作为系统测试的主要部分&#xff0c…

APP移动测试用例总结

目录 前言 一、首先是测试资源确认及准备 二、测试用例的设计与评审 三、UI测试 四、功能测试 五、中断测试 六、兼容性及适配测试 七、性能测试 八、稳定性测试 九、测试分析及测试报告输出 十、移动端测试用例的实践经验 结语 前言 在我们的测试工作中&#xff0c;对于某…

手机app测试用例怎么写?手机app测试点有哪些?没有水分,错过绝对后悔

目录 一、前言 二、安装卸载测试点 安装测试 卸载测试 三、登录注册测试点 登录测试点 注册测试点 四、更新推送测试点 数据更新 消息推送 五、还有易用性&#xff0c;兼容性&#xff0c;安全性太多了&#xff01; 一、前言 在当今竞争激烈的市场上一个APP的成功离不…

淘宝APP购物车测试用例

淘宝APP购物车测试用例 淘宝购物车界面界面测试&#xff1a; 1、打开页面后&#xff0c;页面显示是否完整&#xff0c;页面布局是否合理。&#xff08;1&#xff09;标题、宝贝数显示、降价提示、管理。&#xff08;2&#xff09;字体大小、字体格式。 2、不同店家的商品在不…

手机app测试用例怎么写?手机app测试点有哪些?

随着科技的发展&#xff0c;购物、旅游、支付等日常衣食住行活动都离不开手机&#xff0c;由此衍生了很多APP。比如每天使用频率非常高的微信、支付宝、微博、抖音、王者荣耀等等。APP测试主要进行功能测试、性能测试、自动化测试、安全性测试、兼容性测试、专项测试。 APP测试…

app测试用例

app主要测试类型&#xff1a;安全性、易用性、性能、安装卸载、注册登录、兼容性、更新推送。 1、安全性&#xff1a;权限测试、安装卸载安全性、密码显示存储及长度要求、数据安全性、敏感数据的处理、备份与恢复要求、安全提示要求、数据删除要求、个人信息的使用要求、应用…

手机app测试用例怎么写?手机app测试点有哪些?只有干货没有水分,错过绝对后悔!

目录 一、前言 二、安装卸载测试点 安装测试 卸载测试 三、登录注册测试点 登录测试点 注册测试点 四、更新推送测试点 数据更新 消息推送 五、还有易用性&#xff0c;兼容性&#xff0c;安全性太多了&#xff01; 一、前言 在当今竞争激烈的市场上一个APP的成功离不…

牛顿法与拟牛顿法学习笔记(三)DFP 算法

机器学习算法中经常碰到非线性优化问题&#xff0c;如 Sparse Filtering 算法&#xff0c;其主要工作在于求解一个非线性极小化问题。在具体实现中&#xff0c;大多调用的是成熟的软件包做支撑&#xff0c;其中最常用的一个算法是 L-BFGS。为了解这个算法的数学机理&#xff0c…

拟牛顿法 分析与推导

转自 http://www.cnblogs.com/liuwu265/p/4714396.html &#xff0c;侵删 网上查拟牛顿法的推导&#xff0c;找到一个感觉比较容易读懂的&#xff0c;保存下来 针对牛顿法中海塞矩阵的计算问题&#xff0c;拟牛顿法主要是使用一个海塞矩阵的近似矩阵来代替原来的还塞矩阵&…

优化算法——拟牛顿法之BFGS算法

一、BFGS算法简介 BFGS算法是使用较多的一种拟牛顿方法&#xff0c;是由Broyden&#xff0c;Fletcher&#xff0c;Goldfarb&#xff0c;Shanno四个人分别提出的&#xff0c;故称为BFGS校正。 同DFP校正的推导公式一样&#xff0c;DFP校正见博文“ 优化算法——拟牛顿法之DFP算法…

牛顿法的matlab实现

简介&#xff1a;牛顿法是用来求解无约束优化问题的&#xff0c;它的基本思想是用迭代点xk处的一阶导数和二阶导数对目标函数进行二次函数近似&#xff0c;然后把二次模型的极小点作为新的迭代点&#xff0c;不断重复这一过程&#xff0c;直至满足精度的近似极小点。 这里有必…

最优化方法:牛顿迭代法和拟牛顿迭代法

http://blog.csdn.net/pipisorry/article/details/24574293 基础 拐点 若曲线图形在一点由凸转凹&#xff0c;或由凹转凸&#xff0c;则称此点为拐点。直观地说&#xff0c;拐点是使切线穿越曲线的点。 拐点的必要条件&#xff1a;设 f ( x ) {\displaystyle f(x)} 在 ( a , b…

Newton法(牛顿法 Newton Method)

平时经常看到牛顿法怎样怎样&#xff0c;一直不得要领&#xff0c;今天下午查了一下维基百科&#xff0c;写写我的认识&#xff0c;很多地方是直观理解&#xff0c;并没有严谨的证明。在我看来&#xff0c;牛顿法至少有两个应用方向&#xff0c;1、求方程的根&#xff0c;2、最…