用Stream流方式合并两个list集合(部分对象属性重合)

server/2024/9/25 4:44:03/

一、合并出共有部分

package com.xu.demo.test;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class ListMergeTest1 {public static void main(String[] args) {List<User> list1 = Arrays.asList(new User(1, "Alice"), new User(2, "Bob"), new User(4, "Ronnie"));List<User> list2 = Arrays.asList(new User(2, "Bobby"), new User(3, "Charlie"), new User(5, "Trump"));List<User> mergedList = list1.stream().flatMap(user1 -> list2.stream().filter(user2 -> user1.getId() == user2.getId()).map(user2 -> {User newUser = new User();newUser.setId(user2.getId());newUser.setName(user2.getName());return newUser;})).collect(Collectors.toList());mergedList.forEach(System.out::println);}}class User {private int id;private String name;public User(int id, String name) {this.id = id;this.name = name;}// Getter and Setter methodspublic int getId() {return id;}public String getName() {return name;}public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}public User() {}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}
}

运行结果:注意流处理中return的位置

二、合并到某一List(假如保留到第一个List)

package com.xu.demo.test;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class ListMergeTest2 {public static void main(String[] args) {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);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);System.out.println(list1);System.out.println(list2);//使用stream流把list1和list2根据属性userId合并一个list集合list1.stream().map(m1 -> {list2.stream().filter(m2 -> m1.get("userId").equals(m2.get("userId"))).forEach( m2 -> {m1.put("gender", m2.get("gender"));m1.put("age", m2.get("age"));});return m1;}).collect(Collectors.toList());System.out.println(list1);System.out.println(list2);}}

运行结果如下:注意流处理中return的位置

Java8的流式处理提供了大量强大而且简单的数据(结构)处理,一定要好好总结学习,对你的编程思维和能能力的提高大有好处。 


http://www.ppmy.cn/server/24452.html

相关文章

LabVIEW和MES系统的智能化车间数据对接

LabVIEW和MES系统的智能化车间数据对接 随着工业4.0时代的到来&#xff0c;智能制造成为推动制造业高质量发展的重要手段。其中&#xff0c;数字化车间作为智能制造的重要组成部分&#xff0c;其设计与实现至关重要。在数字化车间环境下&#xff0c;如何利用LabVIEW软件与MES系…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置&#xff1a;2C&#xff0c;2G内存&#xff0c;50G存储 3、集群架构 从表格中&#xff0c;可以看出&#xff0c;Hadoop集群&#xff0c;主要有2部分&#xff0c;一个是HDFS服务&#xff0c;一个是YARN服务 …

Linux配置双网卡,1NAT 2桥接,ARM板上网

1、简介 版本型号&#xff1a;ubuntu18.04 ARM板型号&#xff1a;6ull本文主要记录配置第一次ubuntu与arm板连接的nfs配置和ARM板上网的配置&#xff0c;按照配置网络、配置nfs系统、给板子连网 顺序进行。该配置的前提是创建ubuntu系统的网络配置选择的是NAT模式&…

Elasticsearch内存占用分析

目录 1. 堆内存 (Heap Memory) 2. 索引缓存 (Index Cache) 3. 段缓存 (Segment Cache) 4. 文件系统缓存 (File System Cache) 5. 分片和副本 (Shards and Replicas) 6. 分析器和令牌器 (Analyzers and Tokenizers) 7. 过度配置 (Over-Allocation) 8. 垃圾回收 (Garbage…

基于Spring Boot的口腔管理平台设计与实现

基于Spring Boot的口腔管理平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面图&#xff0c;管理员登录进入口腔管理平…

python安装cx_Oracle 遇到的问题

重要&#xff1a; 搞了一天&#xff0c;最后发现是python的版本和cx_Oracle版本对不上。 一开始安装的python版本是3.12&#xff0c;而cx_Oracle的最新版本是8.3.0&#xff0c; 对应的python版本为3.10&#xff0c;因此将python版本降低为3.10&#xff0c; 执行 pip install cx…

react怎么做到点击传参

在React中&#xff0c;点击事件传参通常涉及到在事件处理函数中访问和使用传递的参数。有几种不同的方法可以实现点击传参&#xff0c;这里列出两种常见的方式&#xff1a; 1. 直接在事件处理函数中接收参数 你可以直接在事件处理函数中接收参数&#xff0c;并在调用事件处理…

【UE5】动态播放媒体

最近项目中有一个需求&#xff0c;需要将场景中的42块屏幕都显示媒体内容&#xff0c;想着如果每一块屏幕都创建一个MediaPlayer资产、一个MediaSource资产、一个MediaTexture资产及创建对应的Material&#xff0c;就是4*42168个资产需要维护了&#xff0c;所以想着就全部采用动…