Java的流操作:让数据处理更简单,更高效
Java 8引入了一种新的抽象概念——流(Stream),它允许我们以声明式方式处理数据集合。通过使用流,可以更简洁、更易读地编写代码来对集合进行复杂的操作,如过滤、映射、排序等。本文将介绍Java 8的流操作的基本概念和使用方法。
创建流
要使用流,首先需要创建一个流。流可以从多种数据源创建,如数组、集合、文件等。以下是一些创建流的示例:
// 从数组创建流
int[] numbers = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(numbers);// 从集合创建流
List<String> names = Arrays.asList("张三", "李四", "王五");
Stream<String> nameStream = names.stream();// 从文件创建流
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {lines.forEach(line -> {/*TODO:逐行处理文件内容*/ });
} catch (IOException e) {e.printStackTrace();
}
中间操作
中间操作是对流中的元素进行某种处理的操作,例如过滤、映射、排序等。中间操作不会改变流本身,而是返回一个新的流,因此可以通过链式调用方法组合多个中间操作。以下是一些常见的中间操作:
// 过滤元素
IntStream evenNumbers = intStream.filter(n -> n % 2 == 0);// 转换元素
Stream<Integer> evenNumbers1 = evenNumbers.mapToObj(Integer::new);// 映射元素
Stream<String> upperCaseNames = nameStream.map(String::toUpperCase);// 排序元素
Stream<String> sortedNames = nameStream.sorted();
Stream<String> revSortedNames = names.stream().sorted(Comparator.reverseOrder());
终端操作
终端操作是对流进行最终处理的操作,例如计算结果、遍历元素等。终端操作会消耗流,即执行后流将不再可用。以下是一些常见的终端操作:
// 计算结果(如求和、平均值等)
// 注意:实际使用时,一个流只能使用一次,再次使用需要重新生成流,否则会收到下列异常:
// java.lang.IllegalStateException: stream has already been operated upon or closed
double average = intStream.average().orElse(0);
int sum = intStream.sum();
long count = intStream.count();
OptionalInt max = intStream.max();
OptionalInt min = intStream.min();// 遍历输出每个元素
intStream.forEach(System.out::println);// 收集到列表中
List<Integer> numbersList = intStream.collect(Collectors.toList());
并行流
Java 8还提供了并行流(Parallel Stream),它可以充分利用多核处理器的优势,提高处理速度。要创建一个并行流,只需在创建流时调用parallel()方法或者使用parallelStream()创建流即可:
// 创建一个并行流
IntStream parallelIntStream = intStream.parallel();
Arrays.asList("张三", "李四", "王五").parallelStream();
需要注意的是,并非所有情况下都适合使用并行流。在某些情况下,由于线程切换的开销,并行流的性能可能不如串行流。因此,在使用并行流时,需要根据具体情况进行权衡。
示例:产品分组
使用流可以方便地处理数据,如过滤列表中库存大于0的产品,然后按产品类型进行分组。以下为简单的代码示例,其中省去了代码运行非必需的getter()和toString()方法:
public static void main(String[] args) {List<Product> list = new ArrayList(){{add(new Product(1, 1, 0, "prod1"));add(new Product(2, 1, 5, "prod2"));add(new Product(3, 2, 10, "prod3"));add(new Product(4, 2, 11, "prod4"));add(new Product(5, 2, 0, "prod5"));}};Map<Integer, List<Product>> map = list.parallelStream() // 创建并行流.filter(product -> product.getInventory() > 0) // 过滤库存大于0的产品.collect(Collectors.groupingBy(Product::getProductType)); //分组后收集到Map中System.out.println(map);
}public static class Product {int productId;int productType;int inventory;String productName;public int getProductType() {return productType;}public int getInventory() {return inventory;}public Product(int productId, int productType, int inventory, String productName) {this.productId = productId;this.productType = productType;this.inventory = inventory;this.productName = productName;}
}
总结
Java 8的流操作带来了数据处理的革命性突破,让开发者能够更方便、更简洁地处理数据。通过链式调用方法,开发者能够清晰地表达数据处理逻辑,提高代码的可读性和可维护性。同时,流操作还提供了高性能、类型安全和可扩展性等优势,使得开发者能够根据实际需求灵活地处理数据。
相关文章:
Java的流操作:让数据处理更简单,更高效
Java 8引入了一种新的抽象概念——流(Stream),它允许我们以声明式方式处理数据集合。通过使用流,可以更简洁、更易读地编写代码来对集合进行复杂的操作,如过滤、映射、排序等。本文将介绍Java 8的流操作的基本概念和使…...
3D渲染原理及朴素JavaScript实现【不使用WebGL】
在网页中显示图像和其他平面形状非常容易。 然而,当涉及到显示 3D 形状时,事情就变得不那么容易了,因为 3D 几何比 2D 几何更复杂。 为此,你可以使用专用技术和库,例如 WebGL 和 Three.js。 但是,如果你只…...
解决《荒野大镖客》提示emp.dll文件丢失问题,总结5个修复方法
在当今数字时代,游戏已经成为人们休闲娱乐的重要方式。作为一名游戏爱好者,笔者在近期体验《荒野大镖客》这款游戏时,遇到了一个令人苦恼的问题——emp.dll文件丢失。这个问题让游戏的无法启动进行。本文将围绕这一问题,探讨其原因…...
maven重新加载后Target bytecode version总是变回1.8
现象 Load Maven Changes后 Settings - Build, Execution, Deployment - Java Compiler - Target bytecode version总是变为1.8 Project Structure - Modules - Language level总是变为1.8 解决方法 方法一 pom.xml中包含 <project>[...]<build>[...]<plug…...
react+星火大模型,构建上下文ai问答页面(可扩展)
前言 最近写的开源项目核心功能跑通了,前两天突发奇想。关于项目可否介入大模型来辅助用户使用平台,就跑去研究了最近比较活火的国内大模型–讯飞星火大模型。 大模型api获取 控制台登录 地址:https://console.xfyun.cn/app/myapp 新建应…...
python---设计模式
python中设计模式-单例模式 基于__new__方法实现 第一个设计: class MySingleton:def __init__(self):passdef __new__(cls, *args, **kwargs):passmysingleton1 MySingleton() mysingleton2 MySingleton() print(mysingleton1) print(mysingleton2) print(id(…...
Java编写xml文件时,文件中特殊字符如何解决?
有一个使用Java创建XML文件的需求,但标签里面有以下特殊字符<、>、&等 在未解决之前,创建出的XML是这样的 <?xml version"1.0" encoding"UTF-8"?><actionlist><update><jobno>1111</jobno&…...
vue3 ts pinia openapi vue-query pnpm docker前端架构小记
1.引言 开发中,我们是否经常遇到以下痛点: 项目越大,启动和热更新越来越慢,启动都要花个3-5分钟以上没有类型保障,接口返回的Object不拿到真实数据都不知道有哪些字段,接手别人js项目(无类型)很痛苦需要手…...
ARM day4
LED灯亮灭控制 .text .global _start _start: 1ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3<<4)str r1,[r0] 2ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20)bic r1,r1,#(0x3<<16)orr r1,r1,#(0x1<<16)str r1,[r0]…...
3.30每日一题(多元函数微分学)
1、判断连续:再分界点的极限值等于该点的函数值; 如何求极限值: 初步判断:分母都为二次幂开根号,所以分母为一次幂;分子为二次,一般来说整体为0; 如何说明极限为零(常用…...
《OSTEP》条件变量(chap30)
〇、前言 本文是对《OSTEP》第三十章的实践与总结。 一、条件变量 #include <pthread.h> #include <stdio.h> #include <assert.h>int buffer; int count 0; // 资源为空// 生产,在 buffer 中放入一个值 void put(int value) {assert(count 0);count 1…...
MySQL的索引和复合索引
由于MySQL自动将主键加入到二级索引(自行建立的index)里,所以当select的是主键或二级索引就会很快,select *就会慢。因为有些列是没在索引里的 假设CA有1kw人咋整,那我这个索引只起了前一半作用。 所以用复合索引&am…...
关于mac下pycharm旧版本没删除的情况下新版本2023安装之后闪退
先说结论,我用的app cleaner 重新删除的pycharm ,再重新安装即可。在此记录一下 之前安装的旧版的2020的pycharm,因为装不了新的插件,没办法就升级了。新装2023打开之后闪退,重启系统也不行,怀疑是一起破解…...
Django中如何让DRF的接口针对前后台返回不同的字段
在Django中,使用Django Rest Framework(DRF)时,可以通过序列化器(Serializer)和视图(View)的组合来实现前后台返回不同的字段。这通常是因为前后台对数据的需求不同,或者…...
【机器学习】Kmeans聚类算法
一、聚类简介 Clustering (聚类)是常见的unsupervised learning (无监督学习)方法,简单地说就是把相似的数据样本分到一组(簇),聚类的过程,我们并不清楚某一类是什么(通常无标签信息)࿰…...
getid3 获取视频时长
1、首先,我们需要先下载一份PHP类—getid3https://codeload.github.com/JamesHeinrich/getID3/zip/master 2.我在laravel6.0 中使用 需要在composer.json 自动加载 否则系统访问不到 在命令行 执行 composer dump-autoload $getID3 new \getID3();//视频文件需要放…...
如何知道一个程序为哪些信号注册了哪些信号处理函数?
https://unix.stackexchange.com/questions/379694/is-there-a-way-to-know-if-signals-are-present-in-your-application-and-which-sign 使用 strace...
34 mysql limit 的实现
前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…...
jbase实现申明式事务
对有反射的语言,申明式事务肯定不可少。没必要没个人都try,catch写事务,写的不好的话还经常容易锁表,为此给框架引入申明式事务。申明式既字面意思,在需要事务的方法前面加一个申明,那么框架保证事务。 首…...
如何在在线Excel文档中规范单元格输入
在日常的工作中,我们常常需要处理大量的数据。为了确保数据的准确性和可靠性。我们需要对输入的数据进行规范化和验证。其中一个重要的方面是规范单元格输入。而数据验证作为Excel中一种非常实用的功能,它可以帮助用户规范单元格的输入,从而提…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
