jdk8使用stream實(shí)現(xiàn)兩個(gè)list集合合并成一個(gè)(對(duì)象屬性的合并)
java使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并:根據(jù)兩個(gè)List中的某個(gè)相同字段合并成一條List,包含兩個(gè)List中的字段
一、前言
為什么要用Lambda表達(dá)式和Stream流做集合的處理? 因?yàn)樾矢?、代碼簡(jiǎn)潔、高端大氣上檔次!
(1)描述:比如一個(gè)List集合中List<對(duì)象1>,該對(duì)象1包含A、B和C列;另外一個(gè)List集合中List<對(duì)象2>,該對(duì)象2包含A、D列;
(2)問(wèn)題:需要將兩個(gè)List合成List<對(duì)象3>返回,該對(duì)象3包含A、B、C、D列
(3)實(shí)現(xiàn):使用stream實(shí)現(xiàn)兩個(gè)list集合合并成一個(gè)list集合
簡(jiǎn)要說(shuō)明:filter的使用方式為: filter(item -> item的邏輯判斷 ) ,其中filter會(huì)保留判斷條件為true的記錄
二、示例
示例1:java8 合并兩個(gè) list<map>
java8 合并兩個(gè) list<map>, 并將userId 相同的所有屬性合并到一個(gè)map中
list1中對(duì)象的屬性:userId、userName
list2中對(duì)象的屬性:userId、gender、age
最總集合中對(duì)象的屬性: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: 合并兩個(gè)list<map>,并將userId相同的其它屬性合并
* @Title: mergeList
* @param: @return
* @return: List<Map<String,Object>>
* @throws
*/
public static List<Map<String,Object>> mergeList(){
//構(gòu)建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);
//構(gòu)建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根據(jù)屬性u(píng)serId合并一個(gè)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;
}
}
合并運(yùn)行結(jié)果:

示例2:java8 合并兩個(gè) list<T>
java8 合并兩個(gè) list<T>, 并將tickeId相同的所有屬性合并到一個(gè)T中
list1中對(duì)象的屬性:ticketId、ticketName
list2中對(duì)象的屬性:ticketId、saleNum、batchAvailableNum
最總集合中對(duì)象的屬性: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: 合并兩個(gè)list<Ticket>,并將ticketId相同的其它屬性合并
* @Title: mergeList
* @param: @return
* @return: List<Ticket>
* @throws
*/
public static List<Ticket> mergeList(){
//構(gòu)建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);
//構(gòu)建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根據(jù)屬性ticketId合并一個(gè)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;
}
}
合并運(yùn)行結(jié)果:

示例3:java8 合并兩個(gè) list<T>,集合個(gè)數(shù)前者小于后者,要后者
list1中對(duì)象的屬性:ticketId、ticketName
list2中對(duì)象的屬性:ticketId、batchId
最總集合中對(duì)象的屬性: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
想要的結(jié)果: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
代碼實(shí)現(xiàn):
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: 合并兩個(gè)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集合中,根據(jù)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;
}
}
合并運(yùn)行結(jié)果:

示例4:java8 合并兩個(gè) list<T>,集合個(gè)數(shù)前者大于后者,要后者
list1中對(duì)象的屬性:ticketId、ticketName
list2中對(duì)象的屬性:ticketId、batchId
最總集合中對(duì)象的屬性:ticketId、ticketName、batchId
list1:
ticketId:10001 , ticketName:唐僧
ticketId:10002 , ticketName:八戒
list2:
ticketId:10001 , batchId:1
ticketId:10001 , batchId:2
想要的結(jié)果:list1合并到 list 2,過(guò)濾掉batch不存在的數(shù)據(jù)
ticketId:10001 , ticketName:唐僧,batchId:1
ticketId:10001 , ticketName:唐僧,batchId:2
代碼實(shí)現(xiàn):
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: 合并兩個(gè)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集合中,根據(jù)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;
}
}
合并運(yùn)行結(jié)果:

到此這篇關(guān)于jdk8使用stream實(shí)現(xiàn)兩個(gè)list集合合并成一個(gè)(對(duì)象屬性的合并)的文章就介紹到這了,更多相關(guān)jdk8 stream list集合合并內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java中的四種引用類(lèi)型(強(qiáng)軟弱虛)
Java中的引用類(lèi)型主要分為四種,分別是強(qiáng)引用、軟引用、弱引用和虛引用,這篇文章主要為大家詳細(xì)介紹了四者的使用與區(qū)別,需要的小伙伴可以參考下2023-10-10
springboot 如何重定向redirect 并隱藏參數(shù)
這篇文章主要介紹了springboot 如何重定向redirect 并隱藏參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
解決springboot報(bào)錯(cuò)找不到自動(dòng)注入的service問(wèn)題
這篇文章主要介紹了解決springboot報(bào)錯(cuò)找不到自動(dòng)注入的service問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
idea中創(chuàng)建多module的maven工程的方法
這篇文章主要介紹了idea中創(chuàng)建多module的maven工程的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Java中g(shù)etResourceAsStream用法分析
這篇文章主要介紹了Java中g(shù)etResourceAsStream用法,較為詳細(xì)的分析了getResourceAsStream的功能及用法,需要的朋友可以參考下2015-06-06
SpringBoot + thymeleaf 實(shí)現(xiàn)讀取視頻列表并播放視頻功能
這篇文章主要介紹了SpringBoot + thymeleaf 實(shí)現(xiàn)讀取視頻列表并播放視頻功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問(wèn)題的解決辦法
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問(wèn)題的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10

