Java怎么把多个对象的list的数据合并

news/2025/1/15 22:44:52/文章来源:https://www.cnblogs.com/TS86/p/18410979

1.示例一:创建几个包含Person对象的List,并将它们合并成一个新的List

在Java中,将多个对象的List合并通常涉及到遍历这些List并将它们的元素添加到一个新的List中。这里,我将给出一个详细的代码示例,该示例将展示如何将多个包含相同类型对象的List合并成一个List。

假设我们有一个简单的Person类,它有两个属性:nameage。我们将创建几个包含Person对象的List,并将它们合并成一个新的List。

首先,定义Person类:

public class Person {  private String name;  private int age;  // 构造方法  public Person(String name, int age) {  this.name = name;  this.age = age;  }  // Getter和Setter  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  public int getAge() {  return age;  }  public void setAge(int age) {  this.age = age;  }  // toString方法,便于打印Person对象  @Override  public String toString() {  return "Person{" +  "name='" + name + '\'' +  ", age=" + age +  '}';  }  
}

接下来,编写合并List的代码:

import java.util.ArrayList;  
import java.util.List;  public class ListMerger {  public static void main(String[] args) {  // 创建三个List,每个List包含几个Person对象  List<Person> list1 = new ArrayList<>();  list1.add(new Person("Alice", 30));  list1.add(new Person("Bob", 25));  List<Person> list2 = new ArrayList<>();  list2.add(new Person("Charlie", 35));  list2.add(new Person("David", 40));  List<Person> list3 = new ArrayList<>();  list3.add(new Person("Eve", 28));  // 合并这些List  List<Person> mergedList = mergeLists(list1, list2, list3);  // 打印合并后的List  System.out.println(mergedList);  }  // 合并多个List的方法  public static <T> List<T> mergeLists(List<T>... lists) {  List<T> mergedList = new ArrayList<>();  for (List<T> list : lists) {  if (list != null) {  mergedList.addAll(list);  }  }  return mergedList;  }  
}

在这个示例中,我们首先定义了Person类,并为其提供了基本的构造方法、Getter和Setter方法,以及一个toString方法以便于打印。

然后,在ListMerger类中,我们创建了三个包含Person对象的List,并使用mergeLists方法将它们合并。mergeLists方法接受一个可变数量的List参数(通过List<T>... lists实现),然后遍历这些List,并使用addAll方法将它们添加到mergedList中。注意,在添加之前,我们检查了List是否为null,尽管在这个特定的例子中我们并没有创建null的List。

最后,我们打印了合并后的List,展示了合并的效果。

这个示例提供了将多个对象的List合并成一个List的详细步骤,并且代码可以直接运行,具有实际的参考价值和意义。

2.示例二:使用Java 8的Stream API

如果我们使用的是Java 8或更高版本,可以利用Stream API来更简洁地合并List。

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  
import java.util.stream.Collectors;  
import java.util.stream.Stream;  public class ListMergerStream {  public static void main(String[] args) {  List<Person> list1 = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));  List<Person> list2 = Arrays.asList(new Person("Charlie", 35), new Person("David", 40));  List<Person> list3 = Arrays.asList(new Person("Eve", 28));  // 使用Stream API合并List  List<Person> mergedList = Stream.of(list1, list2, list3)  .flatMap(List::stream)  .collect(Collectors.toList());  // 打印合并后的List  mergedList.forEach(System.out::println);  }  // 假设Person类和其他部分与之前的示例相同  
}

在这个示例中,Stream.of(list1, list2, list3)创建了一个包含所有List的Stream,然后flatMap(List::stream)将这个Stream中的每个List转换成一个新的Stream,并将这些Stream合并成一个Stream,最后通过collect(Collectors.toList())收集到一个新的List中。

3.示例三:使用Apache Commons Collections

如果我们在我们的项目中使用了Apache Commons Collections库,我们可以利用CollectionUtils.union方法来合并List。但请注意,CollectionUtils.union返回的是一个新的集合,它包含了所有给定集合的元素的视图,但这些元素并不保证是唯一的(除非原始集合中的元素本身就是唯一的)。

然而,对于List的合并,我们可能需要一个确实包含所有元素的新List,而不是一个视图。因此,我们可能需要将结果转换为一个新的List。但Apache Commons Collections本身可能没有直接的方法来做到这一点,所以我们可能仍然需要一些额外的步骤。不过,对于简单的合并操作,我们通常会使用Java标准库中的方法或Stream API。

但如果我们确实想使用Apache Commons Collections,并且想要一个包含所有元素的新List,我们可以这样做:

import org.apache.commons.collections4.CollectionUtils;  import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.Collection;  
import java.util.List;  public class ListMergerApache {  public static void main(String[] args) {  // 假设list1, list2, list3已经定义并初始化  // 使用Apache Commons Collections的CollectionUtils来合并(但注意这不是直接支持List的合并)  // 一个简单的方法是使用ArrayList的构造器来接收一个Collection  List<Person> mergedList = new ArrayList<>(CollectionUtils.union(list1, list2, list3));  // 注意:如果list中有重复元素,并且我们想要去重,我们可能需要额外的步骤  // 打印合并后的List  mergedList.forEach(System.out::println);  }  // 假设Person类和其他部分与之前的示例相同  // 注意:CollectionUtils.union在Apache Commons Collections 4中可用,并且它接受可变数量的Collection参数  
}

但请注意,上面的代码示例中的CollectionUtils.union实际上并不直接支持可变数量的List作为参数,而是支持可变数量的Collection。因此,上面的代码示例在技术上可能不是完全准确的,因为CollectionUtils.union的常用重载方法只接受两个Collection参数。如果我们需要合并多于两个的List,我们可能需要连续调用union或使用其他方法(如Java标准库中的方法或Stream API)。

在实际应用中,由于Java标准库已经提供了强大且灵活的工具(如Stream API),因此通常不需要额外依赖Apache Commons Collections来执行基本的集合操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796202.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNO 已知问题 在后台线程触发 SKXamlCanvas 的 Invalidate 且在 PaintSurface 事件抛出异常将炸掉应用

本文记录一个 UNO 已知问题,在 UNO 里面可以利用 SKXamlCanvas 对接 Skia 绘制到应用里面。如果此时在后台线程里面调用 SKXamlCanvas 的 Invalidate 触发界面的重新刷新,但在具体的执行绘制 PaintSurface 事件里面对外抛出异常,将会导致应用炸掉背景: 我准备在 UNO 里面将…

WPF 的 WriteableBitmap 在 Intel 11 代 Iris Xe Graphics 核显设备上停止渲染

在 Intel 11 代锐炬 Intel Iris Xe Graphics 核显设备上,如果此设备使用旧版本驱动,则可能导致 WPF 的 WriteableBitmap 停止渲染。此问题和 WPF 无关,此问题是 Intel 的 bug 且最新驱动版本已修复官方问题记录地址:https://www.intel.cn/content/www/cn/zh/support/articl…

WPF 的 Viewport3D 等 3D 模块在带 Intel UHD 770 设备上抛出渲染异常

在带 Intel UHD 770 的设备上,使用旧版本驱动,即小于 30.0.101.1660 版本驱动,将会导致 WPF 的 3D 模块出现渲染异常。此问题和 WPF 无关,此问题是 Intel 的 bug 且最新驱动版本已修复官方问题记录地址:https://community.intel.com/t5/Graphics/Crash-with-UHD-770-in-WP…

【Azure Service Bus】批量处理Service Bus Topic 中的死信消息(dead-lettered messages)

问题描述 在Azure的门户页面上,因为Service Bus Topic中有很多dead-lettered message,而这些消息占用了大量的存储空间,通过门户上的Service Bus Explorer每次只能消费一条消息。 虽然可以通过修改代码来指定消费私信队列中消息,但是需要修改代码,需要一些工作量。 有没有…

Transformer两大发展方向——GPT系列及BERT(一)

前面介绍了Transformer,随着其发展在NLP领域应用越来越多,在其基础上主要有两篇影响非常大的文章,一篇是GPT,另一篇是BERT。OpenAI提出的GPT采用Transformer解码器结构,一路更新迭代到了现在有了GPT-4,而Google提出的BERT采用Transformer的编码器结构。大体时间线如下图所…

RustPython简单使用

RustPython介绍 同CPython,Jpython,PyPy一样,RustPython,是使用Rust语言实现的Python解释器,支持Python3语法。 项目地址:https://github.com/RustPython/RustPython RustPython真正方便的是可以编译成Wasm文件,可以直接在浏览器中使用,示例网站:https://rustpython.g…

【解题报告】P8478 「GLR-R3」清明

我无可代替,哪怕来历已不神秘;麦克风接力,百万人就等我出席。P8478 「GLR-R3」清明 参考了出题人题解和 xcyyyyyy 大神的题解,强推前两篇。 拿到题完全没思路怎么办??? 人类智慧的巅峰,思维量的登峰造极。 换句话说就是非人题目,不过不得不说 GLR 的题是真的好,难度也…

Openwrt安装ddns-go

必备条件已刷好OpenWRT的路由 Openwrt已配置好网络根据CPU架构下载DDNS-go 我用的是迅雷赚钱宝1代,其CPU是arm7,所以要下载对应的arm7版本 https://github.com/jeessy2/ddns-go/releases 解压文件,将文件复制到openwrt 用WinSCP连接OpenWRT,复制ddns-go进去 WinSCP下载 如果…

python如何使用 秘钥证书 进行 SM2 加密

最近一个项目,需要使用sm2非对称加密,对方直接给的秘钥证书,python使用gmssl 进行加密,解密,加签,验签用的秘钥是这种格式 # Private Key秘钥 5aa03412c3051e1d4cf9d19cfbeeec70c28f388c9f82747cc912096c9cd44bea # Public Key 公钥 044291b381a039a8d7d02d7272d2d7c78a30d33e…

让小爱音箱播放电脑/NAS上歌曲,支持自动从哔哩哔哩/油管下载歌曲,无需刷机。支持语音控制和WebUI控制,docker部署多平台兼容,解决仅能播放试听版的苦恼

小米AI音箱很多人都有,但使用中播放歌曲时总是提示仅能播放试听版,不能完整听歌,很烦人。今天介绍的方法就是要彻底解决这个问题,实现让小爱AI音箱能够播放本地歌曲,本地没有的歌曲还能自动从网上搜索下载的功能。 已测试支持的设备:型号 名称L06A 小爱音箱L07A Redmi小爱…

Linux系统搭建性能测试监控体系

一.安装Grafana 1.Grafana介绍: Grafana是一个开源的监控和可视化工具,用于显示和跟踪各种指标,数据和日志,支持多种源,包括influxDB、prometheus、mango DB,Redis,Mysql,PostgreSQL等。它提供多种图标类型,饼图,支持设置预警机制,当监控指标超出预定阈值时,可以通过em…

公胶壳和母胶壳

公胶壳和母胶壳 在电子连接器领域,"公胶壳"和"母胶壳"是两种常见的术语,它们通常用来描述连接器的性别,即插头和插座。公胶壳:通常指的是连接器的阳性部分,也就是带有突出的针脚或插销的部分。这些针脚可以插入母胶壳中的相应孔洞,以完成电路的连接。…