Java集合List和Map互轉(zhuǎn)的方法總結(jié)
最近遇到了一個(gè)場(chǎng)景是,要將從數(shù)據(jù)庫中查出的List<bean>轉(zhuǎn)換為L(zhǎng)ist<map>然后再取map中的value,最后把所有的value寫到Excel中。由于這個(gè)bean的屬性太多了,我最開始沒有采用list轉(zhuǎn)map的方式取獲取value,而是在for循環(huán)中,寫了大量的get方法,導(dǎo)致代碼量太高。當(dāng)然處理這個(gè)問題不用poi而選用easyexcel應(yīng)該是更簡(jiǎn)單的選擇。不過拋開這個(gè)不說,雖然走了一些彎路,但List轉(zhuǎn) Map 和Map轉(zhuǎn)List的方法還是應(yīng)該總結(jié)一下的。
一、List轉(zhuǎn)Map
①、當(dāng)是list<String>時(shí):(就List內(nèi)不是存放一個(gè)對(duì)象時(shí))
比如要實(shí)現(xiàn)將從數(shù)據(jù)庫中查出的字符串按照長(zhǎng)度進(jìn)行分組,并返回給前端
(這里我就往list中插入幾個(gè)數(shù)據(jù),進(jìn)行模擬)
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);
當(dāng)然代碼還可以優(yōu)化一下:(這樣的代碼簡(jiǎn)潔性確實(shí)提高了,不過代碼的可讀性不高,實(shí)際場(chǎng)景下也不太會(huì)這樣寫)。
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) 是一個(gè)Map的方法,用于計(jì)算Map中的Value。 如果Key已經(jīng)存在,則直接返回對(duì)應(yīng)的Value;如果Key不存在,則使用給定的mappingFunction計(jì)算Value并添加到Map中,最后返回Value。 這樣做的好處是可以避免手動(dòng)檢查Key是否存在并添加Value,從而簡(jiǎn)化代碼。 因此,List<String> sub = ans.computeIfAbsent(str.length(), k -> new ArrayList<>()); 的意思是: 如果Map中已經(jīng)包含了指定長(zhǎng)度的字符串列表,則直接取出這個(gè)列表賦值給sub; 否則就新建一個(gè)空列表并把它賦值給sub,并將這個(gè)空列表添加到Map中去。
②、當(dāng)是list<bean>時(shí):(List內(nèi)是存放一個(gè)對(duì)象時(shí))
比如要實(shí)現(xiàn)將從數(shù)據(jù)庫中查出的對(duì)象list,取對(duì)象list中的值,并返回給前端
針對(duì)這種情況,先創(chuàng)建一個(gè)對(duì)象
//創(chuàng)建一個(gè)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));
還可有這種思路寫法:(當(dāng)時(shí)這個(gè)對(duì)象屬性太多,實(shí)際情況還是不要這樣寫),寫的思路可以簡(jiǎn)述為:(這其實(shí)都可以歸到 List<Bean>轉(zhuǎn)List<String>了)將搜索得到的 List<Bean>轉(zhuǎn)化為L(zhǎng)ist<Map<String, String>>再
轉(zhuǎn)換成一個(gè) List<String>
。具體來說,首先對(duì)于列表中的每個(gè)元素,也就是一個(gè) Map<String, String>
,將其所有的鍵值對(duì)取出來。然后對(duì)于每個(gè)鍵值對(duì),即 Map.Entry<String, String>
,只取它的值,也就是 entry.getValue()
,并加入 valueList
中。最終得到的 valueList
即是所有字符串值的列表。
// 從數(shù)據(jù)庫ensure表中讀取數(shù)據(jù) List<Salary> userList = staffMapper.getAllStaff(year, month); log.info("數(shù)據(jù)為:\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()) ? "已確認(rèn)" : "未確認(rèn)"); salaryMap.put("evidence", salary.getEvidence()); salaryList.add(salaryMap); } //取出map鍵值對(duì)中的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轉(zhuǎn)List (這里只寫了轉(zhuǎn)List<bean>)
Map<Integer, String> map33 = new HashMap<>(); map33.put(1, "a"); map33.put(2, "b"); map33.put(3, "c"); // key 轉(zhuǎn) 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 轉(zhuǎn) 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轉(zhuǎn)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);
如果對(duì)map遍歷還不是很熟悉的小伙伴可以再?gòu)?fù)習(xí)一下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遍歷,推薦大容量時(shí)使用 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));
到此這篇關(guān)于Java集合List和Map互轉(zhuǎn)的方法總結(jié)的文章就介紹到這了,更多相關(guān)Java集合List和Map互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java并發(fā)包JUC誕生及詳細(xì)內(nèi)容
這篇文章主要為大家介紹了java并發(fā)包JUC的誕生及JUC增加的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02詳解如何使用MyBatis簡(jiǎn)化JDBC開發(fā)
JavaEE?企業(yè)級(jí)?Java?項(xiàng)目中的經(jīng)典三層架構(gòu)為表現(xiàn)層,業(yè)務(wù)層和持久層.MyBatis?對(duì)?JDBC?代碼進(jìn)行了封裝,作為一款優(yōu)秀的持久層框架,專門用于簡(jiǎn)化JDBC開發(fā).本文主要介紹一下如何使用MyBatis簡(jiǎn)化JDBC開發(fā),需要的可以參考一下2023-01-01Java基于控制臺(tái)界面實(shí)現(xiàn)ATM系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java基于控制臺(tái)界面實(shí)現(xiàn)ATM系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05如何解決Maven打包時(shí)每次都出現(xiàn)Download maven-metadata.xml卡住問題
這篇文章主要介紹了如何解決Maven打包時(shí)每次都出現(xiàn)Download maven-metadata.xml卡住問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題
這篇文章主要介紹了SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06利用spring-data-redis實(shí)現(xiàn)incr自增的操作
這篇文章主要介紹了利用spring-data-redis實(shí)現(xiàn)incr自增的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11Java反射的應(yīng)用之動(dòng)態(tài)代理深入理解
這篇文章主要介紹了Java反射的應(yīng)用之動(dòng)態(tài)代理深入理解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Spring Cloud負(fù)載均衡及遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring Cloud負(fù)載均衡及遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08