[从零开始学习JAVA] Stream流

news2025/3/20 1:21:32

前言:

 本文我们将学习Stream流,他就像流水线一样,可以对我们要处理的对象进行逐步处理,最终达到我们想要的效果,是JAVA中的一大好帮手,值得我们了解和掌握。(通常和lambda 匿名内部类 方法引用相配合)

Stram流:
       

        Stream流的核心思想是函数式编程(注意返回值必须是对象本身才能),它倡导将数据处理过程看作是一系列的转换操作。这种思想与传统的命令式编程方式不同,传统的命令式编程方式强调对数据的直接操作,而函数式编程则更加注重对数据的转换和操作过程。

在使用Stream流时,我们可以将数据源(如集合或数组)看作是一组元素的流,通过一系列的中间操作(如过滤、映射、排序等),最终到达终止操作(如匹配、归约、收集等)来处理数据。

设计目标: 

 

  Stream流的设计目标是提供一种简洁、高效的数据处理方式,使得代码更加可读、易于理解和维护。它的思想是将数据处理过程分解为多个步骤,每个步骤都是一种转换操作,可以对数据进行过滤、映射、排序等操作,最终得到所需要的结果。

        通过使用Stream流,我们可以避免传统的循环和条件判断,将复杂的数据处理逻辑转化为简洁、清晰的方法链式调用,使得代码更加简洁和可读。

        另外,Stream流还支持并行处理,可以将大数据集划分为多个子集并行执行操作,提高处理效率。这种并行处理的方式可以很好地利用多核处理器的优势,使得数据处理更加高效。

        总而言之,Stream流的思想是通过函数式编程的方式,将数据处理过程看作是一系列的转换操作,实现简洁、高效和易于理解的数据处理。它的设计目标是提供一种优雅和强大的数据处理方式,使得开发人员能够更加专注于数据转换的逻辑,而无需关心底层的迭代和条件判断。一般情况下,Stream流会搭配Lambda表达式一起运用,以此来简化集合和数组的操作。
 

使用步骤:

举例:

例如我们想在一堆存储在list中的数据中找到首字为“张”的数据,按照传统的写法来讲,我们需要手动遍历每一个数据,再利用list中的API进行判断首字母,但是Stream流的出现,大大便捷了我们的操作

import java.util.ArrayList;
 
public class test01 {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("张无忌");
        list1.add("赵敏");
        list1.add("张强");
        list1.add("刘三丰");
 
        //传统方法
        for (String s : list1) {
            if(s.startsWith("张"))
            {
                System.out.println(s);
            }
        }
        //直接调用stream流
        list1.stream().filter(name->name.startsWith("张")).forEach(name->System.out.println(name));
 
    }
}

从这个例子中我们可以总结出调用stream流的两步骤:

1.先得到一条Stream流,并把数据放上去。

2.利用Stream流中的各种API进行操作。(可以通过匿名内部类/lambda来实现)
1. filter(Predicate<T> predicate):根据指定的条件过滤流中的元素,返回一个新的流。

2. map(Function<T, R> mapper):对流中的每个元素进行映射操作,返回一个新的流,新流中的元素为映射后的结果。

3. sorted():对流中的元素进行默认排序。

4. sorted(Comparator<T> comparator):对流中的元素按照指定的规则进行排序。

5. distinct():去除流中的重复元素,返回一个新的流。

6. limit(long maxSize):截断流,获取前几个元素。

7. skip(long n):跳过指定数量的元素,返回一个新的流。

8. forEach(Consumer<T> action):对流中的每个元素执行指定的操作。

9. collect(Collector<T, A, R> collector):将流中的元素收集到一个结果集合中。

10. anyMatch(Predicate<T> predicate):判断流中是否有满足指定条件的元素。

11. allMatch(Predicate<T> predicate):判断流中的所有元素是否都满足指定条件。

12. noneMatch(Predicate<T> predicate):判断流中是否没有满足指定条件的元素。

13. findFirst():返回流中的第一个元素。

14. findAny():返回流中的任意一个元素。

15. reduce(BinaryOperator<T> accumulator):将流中的元素按照指定的规约操作进行归约。

16. parallelStream():返回一个并行流,可以并行地处理流中的元素。

使用Stream流的注意事项:

1. Stream流是一次性使用的:一旦对Stream流进行终止操作(如forEach、collect等),就不能再对同一个Stream流进行其他操作。如果需要对同一组数据进行多个处理步骤,需要创建新的Stream流。

2. 注意流的顺序:Stream流的中间操作顺序是很重要的,它们会按照顺序被应用到数据上。因此,在对流进行操作时,请确保中间操作的顺序是正确的,以避免出现错误的结果。

3. 及早终止流:Stream流提供了许多终止操作,如forEach、collect、reduce等。在使用这些终止操作时,应尽量避免无限循环或大量计算,及早终止流以避免性能问题。

4. 注意流的惰性求值:Stream流采用惰性求值的方式,即在终止操作之前,中间操作不会立即执行。这种机制可以提高性能,但也需要注意在需要及时执行的情况下使用及时触发的操作如count、findFirst等。

5. 避免空指针异常:在对流进行操作时,需要注意空值(null)的情况,使用过滤操作时,需要考虑到空元素的处理,避免出现空指针异常。

6. 并行流需谨慎使用:Stream流支持并行处理,可以通过parallelStream方法来获得并行流。但在使用并行流时,需要注意线程安全和性能问题,确保代码在并行执行时不会出现竞态条件或导致性能下降。

7. 适度使用流操作:Stream流提供了丰富的操作方法,但并不意味着所有情况下都应该使用流操作。在简单的数据处理场景中,使用传统的循环方式可能更加直观和高效。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「自动驾驶的数学交响曲:线性代数、微积分与优化理论的深度共舞」—— 解析人工智能背后的高阶数学工具链

引言 自动驾驶系统是数学工具链的集大成者。从传感器数据的多维空间映射到控制指令的生成,每一步都隐藏着线性代数、微积分、概率论和优化理论的精妙配合。本文将构建一个数学模型完整的自动驾驶案例,结合Python代码实现,揭示以下核心数学工具: 线性代数:张量运算与特征空…

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!()&#xff0c;默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate&#xff0c;将 Panic 信息打…

VSCode通过SSH远程登录Windows服务器

系列 1.1 VSCode通过SSH远程登录Windows服务器 1.2 VSCode通过SSH免密远程登录Windows服务器 文章目录 系列1 准备工作2 远程服务器配置2.1 安装SSH服务器2.2 端口 3 本地电脑配置3.1 安装【Remote - SSH】。3.2 登录 1 准备工作 本地电脑Windows 11&#xff0c;已安装VS Cod…

qt下载和安装教程国内源下载地址

qt不断在更新中&#xff0c;目前qt6日渐成熟&#xff0c;先前我们到官方下载或者国内镜像直接可以下载到exe文件安装&#xff0c;但是最近几年qt官方似乎在逐渐关闭旧版本下载通道&#xff0c;列为不推荐下载。但是qt5以其广泛使用和稳定性&#xff0c;以及积累大量代码使得qt5…

mysql 到 doris 挪移数据

工具datax..... 下载地址&#xff1a;http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 下载以后解压&#xff1a;tar -xvzf datax.tar.gz 然后&#xff0c;理论上就可以直接使用了。但是&#xff0c;datax本身是python2写的&#xff0c;如果需要python3…

ubuntu系统下添加pycharm到快捷启动栏方法

一、背景 之前在ubuntu系统下使用pycharm时&#xff0c;总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下&#xff0c;然后终端执行命令下面的命令才可修改代码&#xff1a; ./pycharm.sh为了以后方便&#xff0c;这里给出添加pycharm到快捷启动栏的方法 二、添加…

开源:LMDB 操作工具:lmcmd

目录 什么是 LMDB为什么编写 lmcmd安装方法如何使用 连接数据库命令列表 小结 1. 什么是 LMDB LMDB&#xff08;Lightning Memory-Mapped Database&#xff09;是一种高效的键值存储数据库&#xff0c;基于内存映射&#xff08;memory-mapping&#xff09;技术&#xff0c;提供…

angular中的路由传参

目录 一、矩阵参数 一、矩阵参数 在angular中传参时可以使用矩阵参数&#xff0c;即直接通过变量值的形式在地址中体现&#xff0c;但需要注意参数的使用范围为当前路径段&#xff0c;而不是全局的查询参数。 const params {name: lhhh,age: 18,list: [{ name: htt }],}; //先…

AI时代下的心理咨询师新利器:心理咨询小程序

在AI技术日新月异的今天&#xff0c;心理咨询师们也需要与时俱进&#xff0c;借助新型工具来提升咨询效率和服务质量。正如一位优秀的厨师离不开一把锋利的菜刀&#xff0c;心理咨询师同样需要一款得力助手来辅助其工作。而心理咨询小程序&#xff0c;正是这样一款应运而生的工…

垃圾分类--环境配置

写在前面&#xff1a; 如果你们打这届比赛时&#xff0c;还有我们所保留的内存卡&#xff0c;那么插上即可运行&#xff08;因为内存卡里我们已经配置好所有的环境&#xff09; 本文提供两种环境的配置 一种是基于yolov8&#xff1a;YOLOv8 - Ultralytics YOLO Docshttps://d…

json字符串转对象,对象转JSON

背景&#xff1a; JSON字符串与对象之间的转换。在对接接口的数据的时候&#xff0c;因为是实时数据转发过来的。发现后端发过的数据是字符串【JSON字符串】但是我们前端需要的是一个对象。 核心代码&#xff1a; JSON.parse(JSON字符串) 效果展示&#xff1a; 接口JSON字符串转…

pandas中excel自定义单元格颜色

writerpd.ExcelWriter(filepathf05教师固定学生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明细) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口径) ws.cell(1,1).value综合占比&#xff1a; ws.cell(1,2).value固定学生占比…

3D标定中的平面约束-平面方程的几何意义

平面方程的一般形式为 AxByCzD0&#xff0c;其中系数 A、B、C、D共同决定了平面的几何特性。 系数对平面姿态的影响 1. 法向量方向2. 平面位置3. 比例关系4. 姿态变换5.平面空间变换 1. 法向量方向 法向量方向由 A、B、C 决定 核心作用&#xff1a;系数 A、B、C 构成的向量 (…

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&a…

Linux-03 删除ubuntu系统文件夹Videos和Templates后,如何恢复

文章目录 问题解决方法1. 重新创建 Videos 和 Templates 文件夹2. 配置 user-dirs.dirs 文件3. 更新用户目录配置xdg-user-dirs-update4. 重启系统&#xff1a;sudo reboot 问题 手欠的嫌弃Videos和Templates文件夹是空的&#xff0c;也不会用&#xff0c;就删除了&#xff0c…

Linux系统移植篇(十)根文件系统构建 V3 - Yocto

可以简单的将 Ubuntu 理解为一个根文件系统&#xff0c;和我们用 busybox、buildroot 制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上&#xff0c;但是因为 I.MX6ULL 孱弱的性能&#xff0c;本章我们就只移植 Ubuntu 的最小根文件系统&…

E902基于bash与VCS的仿真环境建立

网上看见很多E902仿真的文章&#xff0c;但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120&#xff0c;而我按照相应的步骤与对应的编译器&#xff0c;仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512&#xff0c;反而成功了。现在开…

Pycharm接入DeepSeek,提升自动化脚本的写作效率

一.效果展示&#xff1a; 二.实施步骤&#xff1a; 1.DeepSeek官网创建API key&#xff1a; 创建成功后&#xff0c;会生成一个API key&#xff1a; 2. PyCharm工具&#xff0c;打开文件->设置->插件&#xff0c;搜索“Continue”&#xff0c;点击安装 3.安装完成后&…

Windows安装Apache Maven 3.9.9

第一步下载资源 官网&#xff1a;下载 Apache Maven – Maven 环境变量配置 M2_HOME 指向bin目录 MAVEN_HOME 指向根目录 M2_HOME 不确定是否必须要 Path配置 &#xff0c;需要注意MAVEN顺序应当在java之前 验证是否安装成功&#xff0c;在cmd中以管理员方式打开&#xff0c…

jmeter将返回的数据写入csv文件

举例说明&#xff0c;我需要接口返回体中的exampleid与todoid的数据信息&#xff08;使用边界提取器先将其提取&#xff09;&#xff0c;并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…