java使用stream实现list中对象属性的合并:
根据两个List中的某个相同字段合并成一条List,包含两个List中的字段

目录

  • 一、前言
  • 二、示例
    • 示例1:java8 合并两个 list<map>
    • 示例2:java8 合并两个 list<T>
    • 示例3:java8 合并两个 list<T>,集合个数前者小于后者,要后者
    • 示例4:java8 合并两个 list<T>,集合个数前者大于后者,要后者
    • 延申:一个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集合1List<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集合2List<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集合1List<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集合2List<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;}
}

合并运行结果:

延申:一个list 集合合并去重求和

使用stream实现list中对象属性的合并(去重并求和)

说明:
需要对一个List中的对象进行唯一值属性去重属性求和,对象假设为Student,有id、nums、sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份。
例如说:(“s1”, 1, 1),(“s1”,2,3),(“s2”,3,5), 求和并去重的话,就是(“s1”, 3, 4),(“s2”,3,5)

对象属性:

/*** @author qzz*/
public class Student {private String id;private int nums;private int sums;public String getId() {return id;}public void setId(String id) {this.id = id;}public int getNums() {return nums;}public void setNums(int nums) {this.nums = nums;}public int getSums() {return sums;}public void setSums(int sums) {this.sums = sums;}
}

代码实现:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;/*** @author qzz*/
public class StudentList {public static void main(String[] args) {List<Student> list = new ArrayList<>();Student s1 = new Student();s1.setId("s1");s1.setNums(1);s1.setSums(1);list.add(s1);s1 = new Student();s1.setId("s1");s1.setNums(2);s1.setSums(3);list.add(s1);s1 = new Student();s1.setId("s2");s1.setNums(3);s1.setSums(5);list.add(s1);//合并去重求和List<Student> result = merge(list);result.stream().forEach(e->{System.out.println("id:"+e.getId()+",nums:"+e.getNums()+",sums:"+e.getSums());});}/*** 将id进行合并nums, sums 相加道回合并后的集合使用Java8的流进行处理* @return*/public static List<Student> merge(List<Student> list){List<Student> result = list.stream().collect(Collectors.toMap(Student::getId, a->a,(o1,o2)->{o1.setNums(o1.getNums()+o2.getNums());o1.setSums(o1.getSums()+o2.getSums());return o1;})).values().stream().collect(Collectors.toList());return result;}
}

运行结果:

java jdk8 使用stream实现两个list集合合并成一个list集合(对象属性的合并)相关推荐

  1. java8 使用stream实现两个list集合合并成一个list集合及List切成多个list

    文章目录 java8 合并两个 list<map> java8 合并两个 list<T> 一个list 集合合并去重求和 拆分大list java8 合并两个 list< ...

  2. Java8两个list集合合并成一个list集合

    为什么要用Lambda表达式和Stream流做集合的处理? 因为效率高.代码简洁.高端大气上档次啊! ES6 1.将一个集合中每一个对象的某个元素取出来作为一个新的集合var newList = ol ...

  3. 怎么让两个java文件关联,怎么把多个excel文件合并成一个【几个excle合并成一个】...

    怎么把多个excel文件合并成一个 新建一个BOOK文件,按Alt F11这二个键,VBA编辑界面,点击编辑的菜单:"插入"--"",然后在里面完整复制下面的代 ...

  4. java合并后求和_Java8使用stream实现list中对象属性的合并(去重并求和)

    前言 需要对一个list中的对象进行唯一值属性去重,属性求和,对象假设为billsnums,有id.nums.sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份. 例 ...

  5. python list合并_python基础===两个list合并成一个dict的方法

    def Run(): list2 = [, , , , ]; list3 = ["a", "b", "c", "d",& ...

  6. Java工具类pdfbox将多个pdf合并成一个pdf。

    引入maven依赖: <!-- 将两个或多个单独的PDF文件合并成一个PDF文件--><dependency><groupId>org.apache.pdfbox& ...

  7. java jar合并_多个jar包合并成一个jar包(ant)

    https://blog.csdn.net/gzl003csdn/article/details/53539133 多个jar包合并成一个jar 使用Apache的Ant是一个基于Java的生成工具. ...

  8. 怎么把两个PDF合并成一个?这几种操作轻松合并

    我们在工作中处理过的文件有很多,有时候为了工作更方便,我们通常需要把两个或是多个文件合并成为一个PDF文件,这样只需要打开这一个文件就可以查看全部内容,那么怎么把两个PDF合并成一个呢?这几种操作都可 ...

  9. Java使用iText PDF合并PDF(将多个PDF合并成一个PDF)

    1 配置pom文件 我用的是5.4.3的版本 <dependency><groupId>com.itextpdf</groupId><artifactId&g ...

最新文章

  1. linux——用户理解及管理
  2. 泛函分析——赋范线性空间定义的概念
  3. php ajax sucess 失败,Ajax请求发送成功但不进success的解决方法(图文教程)
  4. strcompare php,PHP中的startswith()和endsWith()函数
  5. Python | 从用户输入数据,保存到文件,读取并打印
  6. 作者:吴东亚(1972-),女,中国电子技术标准化研究院信息技术研究中心高级工程师、副主任,国家OID注册中心副主任。...
  7. 从程序员到项目经理(七):程序员加油站 -- 完美主义也是一种错
  8. 微服务 注册中心的作用_SpringCloud(二)服务注册中心与Eureka工作原理介绍
  9. linux连接wpa wifi密码,Linux环境下使用WIFI模块:使用wpa_supplicant工具配置和连接WIFI-Go语言中文社区...
  10. GAE-BBS v.10 开源下载
  11. 5亿次Web攻击 怎么防住的?
  12. john破解kali密码
  13. 高仿网易评论列表效果之界面分析(一)
  14. 采用Armjio非精确线搜索准则的最速下降法--MATLAB实现
  15. Qt5.12.9 搜狗输入法不能使用,配置解决方案
  16. js转化base64
  17. 优秀自我简介200字_优秀学生自我介绍200字范文
  18. 知了Excel教你vlookup反向查询,就是这么简单
  19. 使用Tensorflow实现声纹识别
  20. 鼓励与信任让人变得更强大

热门文章

  1. 店长宝微信小程序后台功能简介(四)——小程序设置
  2. Vue.js 3.0 学习笔记(十一)Vue Router路由
  3. Android实现仿真iPhone界面
  4. 【新手】关于路径格式的问题(错误提示incomplete universal character name)
  5. Android应用在国外之各种广告集成(Vungle,AppLovin,Google,Facebook)
  6. Rust 中级教程 第5课——trait(3)
  7. 围堵Zoom, 谷歌救得了自己,还是能终结在线办公乱局?
  8. [3D跑酷] GameManager
  9. aps系统功能模块有哪些?看了本文你就知道了
  10. 软件测试条件组合覆盖三角形,软件测试三角形问题(覆盖测试)