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() 合并了两个列表 list1 和 list2,并将结果收集为一个新的列表。接着,我们使用 flatMap() 展开嵌套的 List<List<String>>,将其转换为一个平铺的列表。通过这种方式,数据的合并操作变得非常简洁明了。
三、使用 Stream API 拆分数据
拆分数据是指将一个集合按一定的条件进行分割。Stream API 提供了丰富的操作符,比如 filter()、partitioningBy()、groupingBy() 等,能够灵活地对数据进行拆分。我们来看几个具体的拆分操作示例。
- 根据条件拆分数据
使用 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 对应奇数。
- 按组拆分数据
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中的数据合并与拆分:使用Stream API实现数据的灵活处理 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,数据处理是最基础的操作之一,而在面对…...
Arthas(阿尔萨斯)
Arthas Arthas可以为你做什么? 安装下载 //Linux环境下 wget https://alibaba.github.io/arthas/arthas-boot.jar //Windows环境下可以直接去官网下载压缩包 https://arthas.aliyun.com/doc/download.html//启动命令 java -jar arthas-boot.jar 启动阿尔萨斯&#…...
黑马linux笔记(转载)
学习链接 视频链接:黑马程序员新版Linux零基础快速入门到精通 原文链接:黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…...
SQL Server—通配符(模糊查询)详解
SQL Server—通配符(模糊查询)详解 在SQL Server中,通配符是一种特殊的符号,用于在LIKE运算符中搜索模式。SQL Server支持三种通配符:百分号(%),下划线(_)和方括号([]&am…...
软考系统分析师知识点二:经济管理
前言 今年报考了11月份的软考高级:系统分析师。 考试时间为:11月9日。 倒计时:35天。 目标:优先应试,其次学习,再次实践。 复习计划第一阶段:扫平基础知识点,仅抽取有用信息&am…...
C语言自定义类型联合和枚举(25)
文章目录 前言一、联合体联合体的声明联合体的特点联合体和结构体内存布局对比联合体的大小计算联合体的实际使用样例礼品兑换单判断当前机器是大端还是小端 二、枚举枚举的定义枚举类型的声明枚举类型的优点枚举类型的使用 总结 前言 关于自定义类型除了我们常用的结构体&…...
Kafka 的重平衡问题详解及解决方案
引言 Kafka 是目前非常流行的分布式消息队列系统,被广泛应用于流数据处理、日志分析、事件驱动架构等场景中。Kafka 的高吞吐量和分布式架构在应对海量数据传输方面具有显著优势。然而,Kafka 在处理消费者组时,会面临一个核心问题——重平衡…...
比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别?
比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别? 正确提问失败提问异同 正确提问 ####一堆python源码############# 这里如何根据数据是新建还是更新来调用不同的save方法? 失败提问 ####一堆python源码############# 为什么在修改…...
jmeter学习(1)线程组与发送请求
1、线程组 执行顺序 :setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1)Http请求默认值 作用范围是该线程组下的所有HTTP请求,如果http请求设置的与默认值冲突࿰…...
【小技巧】mysql 判断表字段是否存在 删除字段 sql脚本
MySQL 判断表字段是否存在 删除字段 sql脚本 下面是一个包含插入和更新操作的流程: -- 先尝试插入数据 INSERT IGNORE INTO user_info (last_name, first_name) VALUES (x, y);-- 如果插入成功,ROW_COUNT() 返回 1,否则返回 0 IF ROW_COUNT…...
低代码革命:重塑工业互联网的未来版图
在数字化转型的浪潮中,低代码应用正以前所未有的速度席卷各行各业,尤其是在工业互联网领域,它正悄然改变着企业的技术架构和业务模式。本文将深入探讨低代码应用如何成为工业互联网的技术趋势,并展望其未来的辉煌前景,…...
KNN算法
KNN算法 一 KNN算法介绍二 KNN算法API2.1 KNeighborsClassifier 分类算法2.2 KNeighborsRegressor 回归算法 三 两个经典案例3.1 鸢尾花案例3.2 手写数字识别案例 一 KNN算法介绍 K-近邻算法(K Nearest Neighbor,简称KNN).比如根据你的“邻居…...
TS 中类型的继承
在 TypeScript(TS)中,类型的继承通常通过接口(Interfaces)和类(Classes)来实现。接口提供了一种定义对象形状的方式,而类则提供了一种创建对象实例的方式。以下是如何在 TypeScript …...
在VS code 中部署C#和avalonia开发环境
要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境,您可以按照以下步骤进行: 1. 安装 .NET SDK 下载 .NET SDK: 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK,并下载安装程序。安装 .NET SDK࿱…...
Windows删除service服务
Windows删除service服务 找到命令提示符: 右键,以管理员身份运行 输入: sc delete 服务名 Windows根据TCP端口号查找进程PID再kill进程_windows tcpkill-CSDN博客文章浏览阅读5.3k次,点赞42次,收藏104次。Windows根据…...
【数据结构】---图
图 前言 本篇作为图的基础概念篇, 了解图的离散数学定义, 图的分类, 图模型解决的问题(图的应用), 图的相关算法(仅仅介绍,具体不在此篇展开)。 学习基本路线ÿ…...
《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!
本篇博客深入探讨了 C 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景,然后详细分析了它们的实现方法,包括高效接口设计和性能优化策略。接着,我们通过对比这两种数据结构的性能,探讨了…...
相机基础概念
景深: 景深的定义 DOF:depth of filed 是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。定义3:在镜头前方(焦点的前、后)有一…...
【python】追加写入excel
输出文件运行前(有两张表,“表1”和“Sheet1”): 目录 一:写入单表(删除所有旧工作表,写入新表)二:写入多表(删除所有旧工作表,写入新表&#x…...
继承实现单例模式的探索(二)
前言 本篇文章继续探索通过继承实现单例模式的可行方案,这次的方案将采用反射机制隐式创建派生类实例,示例代码为C#。 代码 v1.0 using System.Reflection;/// <summary> /// 单例模式基类 /// </summary> /// <typeparam name"T&…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
