最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java集合List和Map互轉的方法總結

 更新時間:2023年09月13日 09:40:24   作者:白白白鯉魚  
有時候我們需要將給定的List轉換為Map,或者Map轉換為List,本文主要介紹了Java集合List和Map互轉的方法總結,具有一定的參考價值,感興趣的可以了解一下

最近遇到了一個場景是,要將從數據庫中查出的List<bean>轉換為List<map>然后再取map中的value,最后把所有的value寫到Excel中。由于這個bean的屬性太多了,我最開始沒有采用list轉map的方式取獲取value,而是在for循環(huán)中,寫了大量的get方法,導致代碼量太高。當然處理這個問題不用poi而選用easyexcel應該是更簡單的選擇。不過拋開這個不說,雖然走了一些彎路,但List轉 Map 和Map轉List的方法還是應該總結一下的。

一、List轉Map

①、當是list<String>時:(就List內不是存放一個對象時)

比如要實現(xiàn)將從數據庫中查出的字符串按照長度進行分組,并返回給前端

(這里我就往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);

當然代碼還可以優(yōu)化一下:(這樣的代碼簡潔性確實提高了,不過代碼的可讀性不高,實際場景下也不太會這樣寫)。

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內是存放一個對象時)

比如要實現(xiàn)將從數據庫中查出的對象list,取對象list中的值,并返回給前端

針對這種情況,先創(chuàng)建一個對象

//創(chuàng)建一個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));

到此這篇關于Java集合List和Map互轉的方法總結的文章就介紹到這了,更多相關Java集合List和Map互轉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中joda日期格式化工具的使用示例

    Java中joda日期格式化工具的使用示例

    這篇文章主要介紹了Java中joda日期格式化工具的使用示例,幫助大家更好的利用Java處理時間,感興趣的朋友可以了解下
    2021-01-01
  • 基于java實現(xiàn)人機猜拳游戲

    基于java實現(xiàn)人機猜拳游戲

    這篇文章主要為大家詳細介紹了基于java實現(xiàn)人機猜拳游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • jmeter的時間戳函數使用

    jmeter的時間戳函數使用

    在使用jmeter做接口測試的時候,經常會要用到日期這種函數,本文主要介紹了jmeter的時間戳函數使用,感興趣的可以了解一下
    2021-11-11
  • Java8 LocalDateTime極簡時間日期操作小結

    Java8 LocalDateTime極簡時間日期操作小結

    這篇文章主要介紹了Java8-LocalDateTime極簡時間日期操作整理,通過實例代碼給大家介紹了java8 LocalDateTime 格式化問題,需要的朋友可以參考下
    2020-04-04
  • Java算法設計與分析分治算法

    Java算法設計與分析分治算法

    這篇文章主要介紹了Java算法設計與分析分治算法,一般分治算法在正文中分解為兩個即以上的遞歸調用,并且子類問題一般是不想交的
    2022-07-07
  • Java中的StringBuilder性能測試

    Java中的StringBuilder性能測試

    這篇文章主要介紹了Java中的StringBuilder性能測試,本文包含測試代碼和測試結果,最后得出結論,需要的朋友可以參考下
    2014-09-09
  • 淺談Java中OutOfMemoryError問題產生原因

    淺談Java中OutOfMemoryError問題產生原因

    本文主要介紹了淺談Java中OutOfMemoryError問題產生原因,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SpringBoot集成RedisTemplate的實現(xiàn)示例

    SpringBoot集成RedisTemplate的實現(xiàn)示例

    本文主要介紹了SpringBoot集成RedisTemplate的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-09-09
  • 深入解析Java并發(fā)程序中線程的同步與線程鎖的使用

    深入解析Java并發(fā)程序中線程的同步與線程鎖的使用

    這篇文章主要介紹了深入解析Java并發(fā)編程中線程的同步與線程鎖的使用,synchronized和lock是Java中最常見的控制線程的方法,需要的朋友可以參考下
    2016-03-03
  • Springboot使用put、delete請求報錯405的處理

    Springboot使用put、delete請求報錯405的處理

    這篇文章主要介紹了Springboot使用put、delete請求報錯405的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論

灵台县| 苍梧县| 永寿县| 黄梅县| 郁南县| 于田县| 新平| 合阳县| 中牟县| 宁陵县| 崇明县| 安塞县| 新宁县| 嫩江县| 洛隆县| 马山县| 阿克| 藁城市| 井研县| 荆州市| 阿合奇县| 呼玛县| 南京市| 周口市| 石门县| 罗江县| 都江堰市| 龙泉市| 余干县| 南溪县| 泸溪县| 修文县| 金沙县| 双辽市| 宜城市| 天门市| 凌源市| 玛沁县| 济阳县| 凯里市| 渭源县|