当前位置: 首页 > news >正文

Java中的数据合并与拆分:使用Stream API实现数据的灵活处理

Java中的数据合并与拆分:使用Stream API实现数据的灵活处理

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,数据处理是最基础的操作之一,而在面对大量数据时,合并与拆分数据是常见的需求。Java 8 引入了 Stream API,为数据的操作提供了简洁、灵活的方式。本文将介绍如何使用 Stream API 实现数据的合并与拆分操作,提升代码的可读性和处理效率。

一、什么是Stream API?

Stream API 是 Java 8 引入的一个强大的工具,旨在简化对集合数据的处理。它允许我们使用类似函数式编程的方式来处理数据,尤其适用于对集合对象进行过滤、转换、归约、合并等操作。

Stream API 支持惰性计算,可以在大量数据的情况下提升性能,同时它还支持并行处理,有助于提升处理速度。下面我们将通过实际的代码示例来展示如何使用 Stream API 实现数据合并与拆分。

二、使用 Stream API 合并数据

合并数据通常指的是将多个集合或数组的数据进行拼接、组合。Stream API 提供了 Stream.concat()flatMap() 等方法,来处理数据的合并操作。接下来我们将通过具体示例来演示如何使用这些方法合并数据。

package cn.juwatech.stream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class DataMergeExample {public static void main(String[] args) {// 定义两个集合List<String> list1 = Arrays.asList("A", "B", "C");List<String> list2 = Arrays.asList("D", "E", "F");// 使用 Stream.concat() 合并两个集合List<String> mergedList = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());System.out.println("合并后的数据: " + mergedList);// 合并嵌套列表List<List<String>> nestedList = Arrays.asList(list1, list2);List<String> flatList = nestedList.stream().flatMap(List::stream) // 使用flatMap展开嵌套列表.collect(Collectors.toList());System.out.println("展开后的数据: " + flatList);}
}

在这个示例中,首先我们使用 Stream.concat() 合并了两个列表 list1list2,并将结果收集为一个新的列表。接着,我们使用 flatMap() 展开嵌套的 List<List<String>>,将其转换为一个平铺的列表。通过这种方式,数据的合并操作变得非常简洁明了。

三、使用 Stream API 拆分数据

拆分数据是指将一个集合按一定的条件进行分割。Stream API 提供了丰富的操作符,比如 filter()partitioningBy()groupingBy() 等,能够灵活地对数据进行拆分。我们来看几个具体的拆分操作示例。

  1. 根据条件拆分数据

使用 filter() 可以轻松地根据条件拆分集合。下面的示例演示如何拆分一个整数列表,将其分为奇数和偶数。

package cn.juwatech.stream;import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class DataSplitExample {public static void main(String[] args) {// 定义一个整数列表List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用 partitioningBy 拆分为奇数和偶数Map<Boolean, List<Integer>> partitionedData = numbers.stream().collect(Collectors.partitioningBy(num -> num % 2 == 0));System.out.println("偶数: " + partitionedData.get(true));System.out.println("奇数: " + partitionedData.get(false));}
}

在这个示例中,我们使用 partitioningBy() 方法将 numbers 列表拆分为两部分:奇数和偶数。拆分后的结果被存储在一个 Map<Boolean, List<Integer>> 中,其中 true 对应偶数,false 对应奇数。

  1. 按组拆分数据

groupingBy() 方法允许我们根据指定的分组条件将数据分为多个组。下面的示例展示如何按年龄段将用户进行分组。

package cn.juwatech.stream;import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;class User {String name;int age;User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return name + "(" + age + ")";}
}public class GroupingExample {public static void main(String[] args) {// 定义一个用户列表List<User> users = Arrays.asList(new User("Alice", 25),new User("Bob", 35),new User("Charlie", 45),new User("David", 25),new User("Edward", 35));// 按年龄分组Map<Integer, List<User>> groupedByAge = users.stream().collect(Collectors.groupingBy(user -> user.age));groupedByAge.forEach((age, userList) -> {System.out.println("年龄 " + age + " 的用户: " + userList);});}
}

在这个示例中,我们使用 groupingBy() 方法将用户按年龄进行分组,并输出每个年龄段对应的用户列表。groupingBy() 是一个非常灵活的分组工具,适用于各种分组需求。

四、使用 Stream API 合并对象属性

有时候,我们需要合并多个对象的某些属性,这时 Stream API 也能派上用场。通过 map() 操作,我们可以轻松地提取对象的某个属性,并将其合并为一个新的数据集。下面是一个合并用户姓名的示例。

package cn.juwatech.stream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;class User {String name;int age;User(String name, int age) {this.name = name;this.age = age;}
}public class MergeUserNamesExample {public static void main(String[] args) {// 定义用户列表List<User> users = Arrays.asList(new User("Alice", 25),new User("Bob", 35),new User("Charlie", 45),new User("David", 25));// 合并所有用户的名字String mergedNames = users.stream().map(user -> user.name) // 提取名字.collect(Collectors.joining(", ")); // 合并为一个字符串System.out.println("合并的名字: " + mergedNames);}
}

在这个示例中,map() 方法用于提取每个用户的名字,Collectors.joining(", ") 则用于将所有名字合并为一个逗号分隔的字符串。通过这种方式,我们可以灵活地对对象的某些属性进行合并处理。

五、使用 Stream API 拆分复杂对象

在某些场景下,我们可能需要从一个复杂对象中提取某些部分,将其拆分为多个集合。Stream API 的 map()flatMap() 是处理这种需求的利器。下面的示例展示了如何从一个订单对象中提取商品列表,并将其合并为一个总的商品集合。

package cn.juwatech.stream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;class Product {String name;Product(String name) {this.name = name;}@Overridepublic String toString() {return name;}
}class Order {String orderId;List<Product> products;Order(String orderId, List<Product> products) {this.orderId = orderId;this.products = products;}
}public class FlattenOrderProductsExample {public static void main(String[] args) {// 定义几个订单List<Order> orders = Arrays.asList(new Order("Order1", Arrays.asList(new Product("ProductA"), new Product("ProductB"))),new Order("Order2", Arrays.asList(new Product("ProductC"), new Product("ProductD"))),new Order("Order3", Arrays.asList(new Product("ProductE"))));// 提取并合并所有订单中的商品List<Product> allProducts = orders.stream().flatMap(order -> order.products.stream()) // 展开每个订单中的商品列表.collect(Collectors.toList());System.out.println("所有商品: " + allProducts);}
}

在这个示例中,flatMap() 被用来展开每个订单中的商品列表,并将所有商品合并为一个总的商品集合。

六、总结

通过 Java Stream API,我们能够以简洁、高效的方式实现数据的合并与拆分操作。无论是简单的数据集合操作,还是复杂对象的属性合并,Stream API 都能够灵活应对,并提高代码的可读性和可维护性。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

相关文章:

Java中的数据合并与拆分:使用Stream API实现数据的灵活处理

Java中的数据合并与拆分&#xff1a;使用Stream API实现数据的灵活处理 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在Java开发中&#xff0c;数据处理是最基础的操作之一&#xff0c;而在面对…...

Arthas(阿尔萨斯)

Arthas Arthas可以为你做什么&#xff1f; 安装下载 //Linux环境下 wget https://alibaba.github.io/arthas/arthas-boot.jar //Windows环境下可以直接去官网下载压缩包 https://arthas.aliyun.com/doc/download.html//启动命令 java -jar arthas-boot.jar 启动阿尔萨斯&#…...

黑马linux笔记(转载)

学习链接 视频链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通 原文链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…...

SQL Server—通配符(模糊查询)详解

SQL Server—通配符(模糊查询)详解 在SQL Server中&#xff0c;通配符是一种特殊的符号&#xff0c;用于在LIKE运算符中搜索模式。SQL Server支持三种通配符&#xff1a;百分号&#xff08;%&#xff09;&#xff0c;下划线&#xff08;_&#xff09;和方括号&#xff08;[]&am…...

软考系统分析师知识点二:经济管理

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;35天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…...

C语言自定义类型联合和枚举(25)

文章目录 前言一、联合体联合体的声明联合体的特点联合体和结构体内存布局对比联合体的大小计算联合体的实际使用样例礼品兑换单判断当前机器是大端还是小端 二、枚举枚举的定义枚举类型的声明枚举类型的优点枚举类型的使用 总结 前言 关于自定义类型除了我们常用的结构体&…...

Kafka 的重平衡问题详解及解决方案

引言 Kafka 是目前非常流行的分布式消息队列系统&#xff0c;被广泛应用于流数据处理、日志分析、事件驱动架构等场景中。Kafka 的高吞吐量和分布式架构在应对海量数据传输方面具有显著优势。然而&#xff0c;Kafka 在处理消费者组时&#xff0c;会面临一个核心问题——重平衡…...

比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别?

比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别&#xff1f; 正确提问失败提问异同 正确提问 ####一堆python源码############# 这里如何根据数据是新建还是更新来调用不同的save方法&#xff1f; 失败提问 ####一堆python源码############# 为什么在修改…...

jmeter学习(1)线程组与发送请求

1、线程组 执行顺序 &#xff1a;setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1&#xff09;Http请求默认值 作用范围是该线程组下的所有HTTP请求&#xff0c;如果http请求设置的与默认值冲突&#xff0…...

【小技巧】mysql 判断表字段是否存在 删除字段 sql脚本

MySQL 判断表字段是否存在 删除字段 sql脚本 下面是一个包含插入和更新操作的流程&#xff1a; -- 先尝试插入数据 INSERT IGNORE INTO user_info (last_name, first_name) VALUES (x, y);-- 如果插入成功&#xff0c;ROW_COUNT() 返回 1&#xff0c;否则返回 0 IF ROW_COUNT…...

低代码革命:重塑工业互联网的未来版图

在数字化转型的浪潮中&#xff0c;低代码应用正以前所未有的速度席卷各行各业&#xff0c;尤其是在工业互联网领域&#xff0c;它正悄然改变着企业的技术架构和业务模式。本文将深入探讨低代码应用如何成为工业互联网的技术趋势&#xff0c;并展望其未来的辉煌前景&#xff0c;…...

KNN算法

KNN算法 一 KNN算法介绍二 KNN算法API2.1 KNeighborsClassifier 分类算法2.2 KNeighborsRegressor 回归算法 三 两个经典案例3.1 鸢尾花案例3.2 手写数字识别案例 一 KNN算法介绍 K-近邻算法&#xff08;K Nearest Neighbor&#xff0c;简称KNN&#xff09;.比如根据你的“邻居…...

TS 中类型的继承

在 TypeScript&#xff08;TS&#xff09;中&#xff0c;类型的继承通常通过接口&#xff08;Interfaces&#xff09;和类&#xff08;Classes&#xff09;来实现。接口提供了一种定义对象形状的方式&#xff0c;而类则提供了一种创建对象实例的方式。以下是如何在 TypeScript …...

在VS code 中部署C#和avalonia开发环境

要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 安装 .NET SDK 下载 .NET SDK&#xff1a; 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK&#xff0c;并下载安装程序。安装 .NET SDK&#xff1…...

Windows删除service服务

Windows删除service服务 找到命令提示符&#xff1a; 右键&#xff0c;以管理员身份运行 输入&#xff1a; sc delete 服务名 Windows根据TCP端口号查找进程PID再kill进程_windows tcpkill-CSDN博客文章浏览阅读5.3k次&#xff0c;点赞42次&#xff0c;收藏104次。Windows根据…...

【数据结构】---图

图 前言 本篇作为图的基础概念篇&#xff0c; 了解图的离散数学定义&#xff0c; 图的分类&#xff0c; 图模型解决的问题&#xff08;图的应用&#xff09;&#xff0c; 图的相关算法&#xff08;仅仅介绍&#xff0c;具体不在此篇展开&#xff09;。 学习基本路线&#xff…...

《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!

本篇博客深入探讨了 C 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景&#xff0c;然后详细分析了它们的实现方法&#xff0c;包括高效接口设计和性能优化策略。接着&#xff0c;我们通过对比这两种数据结构的性能&#xff0c;探讨了…...

相机基础概念

景深&#xff1a; 景深的定义 DOF:depth of filed 是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。定义3&#xff1a;在镜头前方&#xff08;焦点的前、后&#xff09;有一…...

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…...

继承实现单例模式的探索(二)

前言 本篇文章继续探索通过继承实现单例模式的可行方案&#xff0c;这次的方案将采用反射机制隐式创建派生类实例&#xff0c;示例代码为C#。 代码 v1.0 using System.Reflection;/// <summary> /// 单例模式基类 /// </summary> /// <typeparam name"T&…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...