jdk8使用stream實現兩個list集合合並成一個(對象屬性的合並)
java使用stream實現list中對象屬性的合並:根據兩個List中的某個相同字段合並成一條List,包含兩個List中的字段
一、前言
為什麼要用Lambda表達式
和Stream流
做集合的處理? 因為效率高、代碼簡潔、高端大氣上檔次!
(1)描述:比如一個List集合中List<對象1>,該對象1包含A、B和C列;另外一個List集合中List<對象2>,該對象2包含A、D列;
(2)問題:需要將兩個List合成List<對象3>返回,該對象3包含A、B、C、D列
(3)實現:使用stream實現兩個list集合合並成一個list集合
簡要說明:filter的使用方式為: filter(item -> item的邏輯判斷 ) ,其中filter會保留判斷條件為true的記錄
二、示例
示例1:java8 合並兩個 list<map>
java8 合並兩個 list<map>, 並將userId 相同的所有屬性合並到一個map中
list1中對象的屬性:userId、userName
list2中對象的屬性:userId、gender、age
最總集合中對象的屬性:userId、userName、gender、age
import java.util.*; import java.util.stream.Collectors; /** * @author qzz */ public class ListTest { public static void main(String[] args) { mergeList(); } /** * @Description: 合並兩個list<map>,並將userId相同的其它屬性合並 * @Title: mergeList * @param: @return * @return: List<Map<String,Object>> * @throws */ public static List<Map<String,Object>> mergeList(){ //構建List集合1 List<Map<String,Object>> list1 = new ArrayList<>(); Map<String,Object> data=new HashMap<>(); data.put("userId","100001"); data.put("userName","唐僧"); list1.add(data); data=new HashMap<>(); data.put("userId","100002"); data.put("userName","八戒"); list1.add(data); data=new HashMap<>(); data.put("userId","100003"); data.put("userName","悟空"); list1.add(data); data=new HashMap<>(); data.put("userId","100004"); data.put("userName","沙僧"); list1.add(data); //構建List集合2 List<Map<String,Object>> list2 = new ArrayList<>(); data=new HashMap<>(); data.put("userId","100001"); data.put("gender","男"); data.put("age",20); list2.add(data); data=new HashMap<>(); data.put("userId","100002"); data.put("gender","雄"); data.put("age",1000); list2.add(data); data=new HashMap<>(); data.put("userId","100003"); data.put("gender","雄"); data.put("age",600); list2.add(data); data=new HashMap<>(); data.put("userId","100004"); data.put("gender","男"); data.put("age",800); list2.add(data); //使用stream流把list1和list2根據屬性userId合並一個list集合 List<Map<String, Object>> list = list1.stream().map(m -> { list2.stream().filter(m2-> Objects.equals(m.get("userId"),m2.get("userId"))).forEach(m2-> { m.put("gender",m2.get("gender")); m.put("age",m2.get("age")); }); return m; }).collect(Collectors.toList()); for(Map<String, Object> map:list){ System.out.println(map.toString()); } return list; } }
合並運行結果:
示例2:java8 合並兩個 list<T>
java8 合並兩個 list<T>, 並將tickeId相同的所有屬性合並到一個T中
list1中對象的屬性:ticketId、ticketName
list2中對象的屬性:ticketId、saleNum、batchAvailableNum
最總集合中對象的屬性:ticketId、ticketName、saleNum、batchAvailableNum
import java.util.*; import java.util.stream.Collectors; /** * @author qzz */ public class ListTest1 { public static void main(String[] args) { mergeList(); } /** * @Description: 合並兩個list<Ticket>,並將ticketId相同的其它屬性合並 * @Title: mergeList * @param: @return * @return: List<Ticket> * @throws */ public static List<Ticket> mergeList(){ //構建List集合1 List<Ticket> list1 = new ArrayList<>(); Ticket data=new Ticket(); data.setTicketId("100001"); data.setTicketName("唐僧"); list1.add(data); data=new Ticket(); data.setTicketId("100002"); data.setTicketName("八戒"); list1.add(data); data=new Ticket(); data.setTicketId("100003"); data.setTicketName("悟空"); list1.add(data); data=new Ticket(); data.setTicketId("100004"); data.setTicketName("沙僧"); list1.add(data); //構建List集合2 List<Ticket> list2 = new ArrayList<>(); data=new Ticket(); data.setTicketId("100001"); data.setSaleNum("20"); data.setBatchAvailableNum("10"); list2.add(data); data=new Ticket(); data.setTicketId("100001"); data.setSaleNum("20"); data.setBatchAvailableNum("10"); list2.add(data); data=new Ticket(); data.setTicketId("100002"); data.setSaleNum("1000"); data.setBatchAvailableNum("600"); list2.add(data); data=new Ticket(); data.setTicketId("100003"); data.setSaleNum("600"); data.setBatchAvailableNum("100"); list2.add(data); data=new Ticket(); data.setTicketId("100004"); data.setSaleNum("800"); data.setBatchAvailableNum("300"); list2.add(data); //使用stream流把list1和list2根據屬性ticketId合並一個list集合 List<Ticket> list = list1.stream().map(m -> { list2.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> { m.setSaleNum(m2.getSaleNum()); m.setBatchAvailableNum(m2.getBatchAvailableNum()); }); return m; }).collect(Collectors.toList()); for(Ticket ticket:list){ System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum()); } return list; } }
合並運行結果:
示例3:java8 合並兩個 list<T>,集合個數前者小於後者,要後者
list1中對象的屬性:ticketId、ticketName
list2中對象的屬性:ticketId、batchId
最總集合中對象的屬性:ticketId、ticketName、batchId
list1:
ticketId:10001 , ticketName:唐僧
ticketId:10002 , ticketName:八戒
list2:
ticketId:10001 , batchId:1
ticketId:10001 , batchId:2
ticketId:10002 , batchId:1
ticketId:10002 , batchId:2
ticketId:10003 , batchId:2
想要的結果:list1合並到 list 2
ticketId:10001 , ticketName:唐僧,batchId:1
ticketId:10001 , ticketName:唐僧,batchId:2
ticketId:10002 , ticketName:八戒,batchId:1
ticketId:10002 , ticketName:八戒,batchId:2
ticketId:10003 , ticketName:八戒,batchId:2
代碼實現:
import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * @author qzz */ public class ListTest2 { public static void main(String[] args) { mergeList(); } /** * @Description: 合並兩個list<map>,並將userId相同的其它屬性合並 * @Title: mergeList * @param: @return * @return: List<Map<String,Object>> * @throws */ public static List<Ticket> mergeList(){ List<Ticket> list1 = new ArrayList<>(); Ticket data=new Ticket(); data.setTicketId("100001"); data.setTicketName("唐僧"); list1.add(data); data=new Ticket(); data.setTicketId("100002"); data.setTicketName("八戒"); list1.add(data); List<Ticket> list2 = new ArrayList<>(); data=new Ticket(); data.setTicketId("100001"); data.setBatchId("1"); list2.add(data); data=new Ticket(); data.setTicketId("100001"); data.setBatchId("2"); list2.add(data); data=new Ticket(); data.setTicketId("100002"); data.setBatchId("1"); list2.add(data); data=new Ticket(); data.setTicketId("100002"); data.setBatchId("2"); list2.add(data); data=new Ticket(); data.setTicketId("100002"); data.setBatchId("3"); list2.add(data); //使用stream流把list1合並到list2集合中,根據ticketId屬性 List<Ticket> list = list2.stream().map(m -> { list1.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> { m.setTicketId(m2.getTicketId()); m.setTicketName(m2.getTicketName()); }); return m; }).collect(Collectors.toList()); for(Ticket ticket:list){ System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getBatchId()); } return list; } }
合並運行結果:
示例4:java8 合並兩個 list<T>,集合個數前者大於後者,要後者
list1中對象的屬性:ticketId、ticketName
list2中對象的屬性:ticketId、batchId
最總集合中對象的屬性:ticketId、ticketName、batchId
list1:
ticketId:10001 , ticketName:唐僧
ticketId:10002 , ticketName:八戒
list2:
ticketId:10001 , batchId:1
ticketId:10001 , batchId:2
想要的結果:list1合並到 list 2,過濾掉batch不存在的數據
ticketId:10001 , ticketName:唐僧,batchId:1
ticketId:10001 , ticketName:唐僧,batchId:2
代碼實現:
import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * @author qzz */ public class ListTest3 { public static void main(String[] args) { mergeList(); } /** * @Description: 合並兩個list<map>,並將userId相同的其它屬性合並 * @Title: mergeList * @param: @return * @return: List<Map<String,Object>> * @throws */ public static List<Ticket> mergeList(){ List<Ticket> list1 = new ArrayList<>(); Ticket data=new Ticket(); data.setTicketId("100001"); data.setTicketName("唐僧"); list1.add(data); data=new Ticket(); data.setTicketId("100002"); data.setTicketName("八戒"); list1.add(data); List<Ticket> list2 = new ArrayList<>(); data=new Ticket(); data.setTicketId("100001"); data.setBatchId("1"); list2.add(data); data=new Ticket(); data.setTicketId("100001"); data.setBatchId("2"); list2.add(data); // data=new Ticket(); // data.setTicketId("100002"); // data.setBatchId("1"); // list2.add(data); // // data=new Ticket(); // data.setTicketId("100002"); // data.setBatchId("2"); // list2.add(data); // // data=new Ticket(); // data.setTicketId("100002"); // data.setBatchId("3"); // list2.add(data); //使用stream流把list1合並到list2集合中,根據ticketId屬性 List<Ticket> list = list2.stream().map(m -> { list1.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> { m.setTicketId(m2.getTicketId()); m.setTicketName(m2.getTicketName()); }); return m; }).collect(Collectors.toList()); for(Ticket ticket:list){ System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getBatchId()); } return list; } }
合並運行結果:
到此這篇關於jdk8使用stream實現兩個list集合合並成一個(對象屬性的合並)的文章就介紹到這瞭,更多相關jdk8 stream list集合合並內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java Stream流零基礎教程
- 一文教你快速生成MySQL數據庫關系圖
- java 中如何實現 List 集合去重
- Java與Scala創建List與Map的實現方式
- Java 數組轉List的四種方式小結