经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
jdk8使用stream实现两个list集合合并成一个(对象属性的合并)
来源:jb51  时间:2022/1/17 16:41:00  对本文有异议

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

  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3.  
  4. /**
  5. * @author qzz
  6. */
  7. public class ListTest {
  8.  
  9. public static void main(String[] args) {
  10. mergeList();
  11. }
  12. /**
  13. * @Description: 合并两个list<map>,并将userId相同的其它属性合并
  14. * @Title: mergeList
  15. * @param: @return
  16. * @return: List<Map<String,Object>>
  17. * @throws
  18. */
  19. public static List<Map<String,Object>> mergeList(){
  20. //构建List集合1
  21. List<Map<String,Object>> list1 = new ArrayList<>();
  22. Map<String,Object> data=new HashMap<>();
  23. data.put("userId","100001");
  24. data.put("userName","唐僧");
  25. list1.add(data);
  26.  
  27. data=new HashMap<>();
  28. data.put("userId","100002");
  29. data.put("userName","八戒");
  30. list1.add(data);
  31.  
  32. data=new HashMap<>();
  33. data.put("userId","100003");
  34. data.put("userName","悟空");
  35. list1.add(data);
  36.  
  37. data=new HashMap<>();
  38. data.put("userId","100004");
  39. data.put("userName","沙僧");
  40. list1.add(data);
  41.  
  42. //构建List集合2
  43. List<Map<String,Object>> list2 = new ArrayList<>();
  44. data=new HashMap<>();
  45. data.put("userId","100001");
  46. data.put("gender","男");
  47. data.put("age",20);
  48. list2.add(data);
  49.  
  50. data=new HashMap<>();
  51. data.put("userId","100002");
  52. data.put("gender","雄");
  53. data.put("age",1000);
  54. list2.add(data);
  55.  
  56. data=new HashMap<>();
  57. data.put("userId","100003");
  58. data.put("gender","雄");
  59. data.put("age",600);
  60. list2.add(data);
  61.  
  62. data=new HashMap<>();
  63. data.put("userId","100004");
  64. data.put("gender","男");
  65. data.put("age",800);
  66. list2.add(data);
  67.  
  68. //使用stream流把list1和list2根据属性userId合并一个list集合
  69. List<Map<String, Object>> list = list1.stream().map(m -> {
  70. list2.stream().filter(m2-> Objects.equals(m.get("userId"),m2.get("userId"))).forEach(m2-> {
  71. m.put("gender",m2.get("gender"));
  72. m.put("age",m2.get("age"));
  73. });
  74. return m;
  75. }).collect(Collectors.toList());
  76.  
  77. for(Map<String, Object> map:list){
  78. System.out.println(map.toString());
  79. }
  80. return list;
  81. }
  82. }
  83.  

合并运行结果:

在这里插入图片描述

示例2:java8 合并两个 list<T>

java8 合并两个 list<T>, 并将tickeId相同的所有属性合并到一个T中

list1中对象的属性:ticketId、ticketName
list2中对象的属性:ticketId、saleNum、batchAvailableNum
最总集合中对象的属性:ticketId、ticketName、saleNum、batchAvailableNum

  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3.  
  4. /**
  5. * @author qzz
  6. */
  7. public class ListTest1 {
  8.  
  9. public static void main(String[] args) {
  10. mergeList();
  11. }
  12. /**
  13. * @Description: 合并两个list<Ticket>,并将ticketId相同的其它属性合并
  14. * @Title: mergeList
  15. * @param: @return
  16. * @return: List<Ticket>
  17. * @throws
  18. */
  19. public static List<Ticket> mergeList(){
  20. //构建List集合1
  21. List<Ticket> list1 = new ArrayList<>();
  22. Ticket data=new Ticket();
  23. data.setTicketId("100001");
  24. data.setTicketName("唐僧");
  25. list1.add(data);
  26.  
  27. data=new Ticket();
  28. data.setTicketId("100002");
  29. data.setTicketName("八戒");
  30. list1.add(data);
  31.  
  32. data=new Ticket();
  33. data.setTicketId("100003");
  34. data.setTicketName("悟空");
  35. list1.add(data);
  36.  
  37. data=new Ticket();
  38. data.setTicketId("100004");
  39. data.setTicketName("沙僧");
  40. list1.add(data);
  41.  
  42. //构建List集合2
  43. List<Ticket> list2 = new ArrayList<>();
  44. data=new Ticket();
  45. data.setTicketId("100001");
  46. data.setSaleNum("20");
  47. data.setBatchAvailableNum("10");
  48. list2.add(data);
  49.  
  50. data=new Ticket();
  51. data.setTicketId("100001");
  52. data.setSaleNum("20");
  53. data.setBatchAvailableNum("10");
  54. list2.add(data);
  55.  
  56. data=new Ticket();
  57. data.setTicketId("100002");
  58. data.setSaleNum("1000");
  59. data.setBatchAvailableNum("600");
  60. list2.add(data);
  61.  
  62. data=new Ticket();
  63. data.setTicketId("100003");
  64. data.setSaleNum("600");
  65. data.setBatchAvailableNum("100");
  66. list2.add(data);
  67.  
  68. data=new Ticket();
  69. data.setTicketId("100004");
  70. data.setSaleNum("800");
  71. data.setBatchAvailableNum("300");
  72. list2.add(data);
  73. //使用stream流把list1和list2根据属性ticketId合并一个list集合
  74. List<Ticket> list = list1.stream().map(m -> {
  75. list2.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> {
  76. m.setSaleNum(m2.getSaleNum());
  77. m.setBatchAvailableNum(m2.getBatchAvailableNum());
  78. });
  79. return m;
  80. }).collect(Collectors.toList());
  81.  
  82. for(Ticket ticket:list){
  83. System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());
  84. }
  85. return list;
  86. }
  87. }
  88.  

合并运行结果:

在这里插入图片描述

示例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

代码实现:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Objects;
  4. import java.util.stream.Collectors;
  5.  
  6. /**
  7. * @author qzz
  8. */
  9. public class ListTest2 {
  10.  
  11. public static void main(String[] args) {
  12. mergeList();
  13. }
  14. /**
  15. * @Description: 合并两个list<map>,并将userId相同的其它属性合并
  16. * @Title: mergeList
  17. * @param: @return
  18. * @return: List<Map<String,Object>>
  19. * @throws
  20. */
  21. public static List<Ticket> mergeList(){
  22. List<Ticket> list1 = new ArrayList<>();
  23. Ticket data=new Ticket();
  24. data.setTicketId("100001");
  25. data.setTicketName("唐僧");
  26. list1.add(data);
  27.  
  28. data=new Ticket();
  29. data.setTicketId("100002");
  30. data.setTicketName("八戒");
  31. list1.add(data);
  32.  
  33. List<Ticket> list2 = new ArrayList<>();
  34. data=new Ticket();
  35. data.setTicketId("100001");
  36. data.setBatchId("1");
  37. list2.add(data);
  38.  
  39. data=new Ticket();
  40. data.setTicketId("100001");
  41. data.setBatchId("2");
  42. list2.add(data);
  43.  
  44. data=new Ticket();
  45. data.setTicketId("100002");
  46. data.setBatchId("1");
  47. list2.add(data);
  48.  
  49. data=new Ticket();
  50. data.setTicketId("100002");
  51. data.setBatchId("2");
  52. list2.add(data);
  53.  
  54. data=new Ticket();
  55. data.setTicketId("100002");
  56. data.setBatchId("3");
  57. list2.add(data);
  58.  
  59. //使用stream流把list1合并到list2集合中,根据ticketId属性
  60. List<Ticket> list = list2.stream().map(m -> {
  61. list1.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> {
  62. m.setTicketId(m2.getTicketId());
  63. m.setTicketName(m2.getTicketName());
  64. });
  65. return m;
  66. }).collect(Collectors.toList());
  67.  
  68. for(Ticket ticket:list){
  69. System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getBatchId());
  70. }
  71. return list;
  72. }
  73. }
  74.  

合并运行结果:

在这里插入图片描述

示例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

代码实现:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Objects;
  4. import java.util.stream.Collectors;
  5.  
  6. /**
  7. * @author qzz
  8. */
  9. public class ListTest3 {
  10.  
  11. public static void main(String[] args) {
  12. mergeList();
  13. }
  14. /**
  15. * @Description: 合并两个list<map>,并将userId相同的其它属性合并
  16. * @Title: mergeList
  17. * @param: @return
  18. * @return: List<Map<String,Object>>
  19. * @throws
  20. */
  21. public static List<Ticket> mergeList(){
  22. List<Ticket> list1 = new ArrayList<>();
  23. Ticket data=new Ticket();
  24. data.setTicketId("100001");
  25. data.setTicketName("唐僧");
  26. list1.add(data);
  27.  
  28. data=new Ticket();
  29. data.setTicketId("100002");
  30. data.setTicketName("八戒");
  31. list1.add(data);
  32.  
  33. List<Ticket> list2 = new ArrayList<>();
  34. data=new Ticket();
  35. data.setTicketId("100001");
  36. data.setBatchId("1");
  37. list2.add(data);
  38.  
  39. data=new Ticket();
  40. data.setTicketId("100001");
  41. data.setBatchId("2");
  42. list2.add(data);
  43.  
  44. // data=new Ticket();
  45. // data.setTicketId("100002");
  46. // data.setBatchId("1");
  47. // list2.add(data);
  48. //
  49. // data=new Ticket();
  50. // data.setTicketId("100002");
  51. // data.setBatchId("2");
  52. // list2.add(data);
  53. //
  54. // data=new Ticket();
  55. // data.setTicketId("100002");
  56. // data.setBatchId("3");
  57. // list2.add(data);
  58.  
  59. //使用stream流把list1合并到list2集合中,根据ticketId属性
  60. List<Ticket> list = list2.stream().map(m -> {
  61. list1.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> {
  62. m.setTicketId(m2.getTicketId());
  63. m.setTicketName(m2.getTicketName());
  64. });
  65. return m;
  66. }).collect(Collectors.toList());
  67.  
  68. for(Ticket ticket:list){
  69. System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getBatchId());
  70. }
  71. return list;
  72. }
  73. }
  74.  

合并运行结果:

在这里插入图片描述

 到此这篇关于jdk8使用stream实现两个list集合合并成一个(对象属性的合并)的文章就介绍到这了,更多相关jdk8 stream list集合合并内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号