文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-01 13:22

关注

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

一、List转Map

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

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

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

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

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

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

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

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

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

//创建一个listList list33 = new ArrayList<>();list33.add(new KeyValue(1, "a"));list33.add(new KeyValue(2, "b"));list33.add(new KeyValue(3, "c"));//打印出listfor(KeyValue item1:list33) {    System.out.print(item1+", ");}System.out.println("\n***************************"); //换行输出// 遍历Map 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 StreamMap map = list33.stream().collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue));map.forEach((k, v) -> System.out.println(k + " ==> " + v));

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

       // 从数据库ensure表中读取数据        List userList =  staffMapper.getAllStaff(year, month);        log.info("数据为:\n{}", userList);        List> salaryList = new ArrayList<>();        for (Salary salary : userList) {            Map 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 valueList = new ArrayList<>();        for (Map salaryMap : salaryList) {            Set> entrySet = salaryMap.entrySet();            for (Map.Entry entry : entrySet) {                valueList.add(entry.getValue());            }        }

 二、Map转List (这里只写了转List

Map map33 = new HashMap<>();map33.put(1, "a");map33.put(2, "b");map33.put(3, "c");// key 转 ListList keyList = new ArrayList<>(map33.keySet());List keyList2 = map33.keySet().stream().collect(Collectors.toList());keyList.forEach(System.out::println);keyList2.forEach(System.out::println);// value 转 ListList valueList = new ArrayList<>(map33.values());List valueList2 = map33.values().stream().collect(Collectors.toList());valueList.forEach(System.out::println);valueList2.forEach(System.out::println);// Iterator转ListList keyValueList = new ArrayList<>();Iterator 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 StreamList list = map33.entrySet().stream().map(c -> new KeyValue(c.getKey(), c.getValue()))        .collect(Collectors.toList());list.forEach(System.out::println);

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

Map 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 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> it = map.entrySet().iterator();while (it.hasNext()) {    Map.Entry 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***************************"); //换行输出// 遍历valuesfor (String v : map.values()) {    System.out.println(v);}System.out.println("\n***************************"); //换行输出map.values().forEach(System.out::println);System.out.println("\n***************************"); //换行输出// Java8 Lambdamap.forEach((k, v) -> System.out.println(k + " ==> " + v));

 

来源地址:https://blog.csdn.net/weixin_49171365/article/details/130928401

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯