[从零开始学习JAVA] Stream流

前言:

 本文我们将学习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.mzph.cn/news/898303.shtml

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

相关文章

设计模式(创建型)-抽象工厂模式

摘要 在软件开发的复杂世界中,设计模式作为解决常见问题的最佳实践方案,一直扮演着至关重要的角色。抽象工厂模式,作为一种强大的创建型设计模式,在处理创建一系列或相关依赖对象的场景时,展现出了独特的优势和灵活性。它通过提供一个创建对象的接口,让开发者能够在不指定…

【JavaEE】-- SpringBoot快速上手

文章目录 1. Maven1.1 什么是Maven1.2 为什么要学Maven1.3 创建一个Maven项目1.4 Maven核心功能1.4.1 项目创建1.4.2 依赖管理1.4.3 Maven Help插件 1.5 Maven仓库1.5.1 本地仓库1.5.2 中央仓库1.5.3 私有服务器&#xff08;私服&#xff09; 1.6 Maven设置国内源1.6.1 配置当前…

TCP/IP 协议精讲-精华总结版本

序言 本文旨在介绍一下TCP/IP涉及得所有基础知识&#xff0c;为大家从宏观上俯瞰TCP/IP提供一个基石&#xff0c;文档属于《TCP/IP图解&#xff08;第五版&#xff09;》的精简版本。 专业术语 缩写 全称 WAN Wide area network广域网 LAN Local area network局域网 TC…

Leetcode 160 Intersection of Two Linked Lists

题意 给定两个链表&#xff0c;找这两个链表第一个公共节点&#xff0c;如果没有返回nullptr 题目链接 https://leetcode.com/problems/intersection-of-two-linked-lists/description/ 题解 两个指针分别从两个链表&#xff08;记录为表A&#xff0c;表B&#xff09;的表…

C语言——结构体、联合、枚举

C语言中自定义类型 结构体结构体变量的创建和初始化结构体传参结构体内存对齐(如何存储) 联合体(共用体)联合体创建和初始化联合体大小(如何存储) 枚举类型枚举类型创建枚举类型初始化枚举的优点(相较于define) 前言 C语言中有内置类型和自定义类型&#xff0c;内置类型就像int…

利用pprof对golang进行性能分析

利用pprof进行性能分析 pprof性能分析的5个方面 一、性能分析的五个核心维度 CPU分析 - 剖析程序的CPU使用情况&#xff0c;定位高耗时函数 内存分析 - 追踪内存分配与泄露&#xff0c;优化内存使用模式 IO分析 - 监控文件/网络IO操作&#xff0c;发现瓶颈资源 Goroutine分…

IntelliJ IDEA 调试技巧指南

在日常开发中&#xff0c;调试是不可或缺的一部分。掌握调试工具的使用可以让我们更高效地定位和解决问题。本文将介绍一些在 IntelliJ IDEA 中常用的调试技巧&#xff0c;希望能帮助你在开发过程中更顺畅地解决问题。 1. 方法断点&#xff1a;快速定位实现类 方法断点可以帮…

gitlab 提交pr

在 GitLab 中&#xff0c;提交合并请求&#xff08;Merge Request, MR&#xff09;的大致流程如下&#xff1a; 1. 创建新分支 如果你还没有创建新的功能分支&#xff0c;可以使用以下命令创建并切换到新分支&#xff1a; git checkout -b feature-branch说明&#xff1a;f…

halcon几何测量(二)计算距离和角度的函数

目录 一、计算两条线之间的夹角二、计算一条直线和水平轴之间的夹角三、计算两个轮廓之间的最小距离四、计算两个轮廓之间的最小距离和对应的点五、计算直线和区域之间的最小和最大距离六、计算点到轮廓线之间的距离七、计算点到直线的距离八、计算点到点的距离九、计算点和区域…

【Linux操作系统——学习笔记二】Linux简单导航命令操作

一、前言 学习Linux&#xff0c;本质上是学习在命令行下熟练使用Linux的各类命令。 命令行&#xff1a;是一种通过输入命令和参数与计算机系统进行交互的方式&#xff0c;可以使用各种字符化命令对系统发出操作指令&#xff0c;打开Linux终端&#xff0c;进入命令行界面。 …

新安装的cursor安装不了插件

我安装的cursor版本0.47.5 直接说解决办法 找到安装路径cursor\resources\app下的product.json 修改https://marketplace.cursorapi.com为https://marketplace.visualstudio.com

算法基础篇(蓝桥杯常考点)

算法基础篇 前言 算法内容还有搜索&#xff0c;数据结构&#xff08;进阶&#xff09;&#xff0c;动态规划和图论 数学那个的话大家也知道比较难&#xff0c;放在最后讲 这期包含的内容可以看目录 模拟那个算法的话就是题说什么写什么&#xff0c;就不再分入目录中了 注意事…

《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》

在数字化浪潮汹涌澎湃的当下&#xff0c;人工智能与操作系统的融合已成为推动科技发展的核心驱动力。华为作为科技领域的先锋&#xff0c;其AI开发框架MindSpore与鸿蒙系统的深度集成备受瞩目&#xff0c;开启了智能生态的新篇章。 华为MindSpore&#xff1a;AI框架的创新先锋…

双3060、Ubuntu22.04、cuda12.8安装deepseek 32b-Q8

以下是针对双RTX 3060显卡&#xff08;12GB显存&#xff09;在Ubuntu 22.04系统部署DeepSeek-R1-32b-qwen-distill-q8模型的完整流程&#xff0c;结合最新技术规范与魔塔社区资源&#xff1a; 一、驱动与CUDA环境配置 1. 禁用开源驱动 bash sudo tee /etc/modprobe.d/blackli…

K8S学习之基础三十四:K8S之监控Prometheus部署pod版

使用 Kubernetes Pod 的方式部署 Prometheus 是一种常见的方法&#xff0c;尤其是在容器化和微服务架构中。以下是详细的步骤&#xff1a; 1. 创建命名空间&#xff08;可选&#xff09; 为了方便管理&#xff0c;可以为 Prometheus 创建一个单独的命名空间。 yaml 复制 a…

Linux top 命令详解:从入门到高级用法

Linux top 命令详解&#xff1a;从入门到高级用法 在 Linux 系统中&#xff0c;top 是一个强大的实时监控工具&#xff0c;用于查看系统资源使用情况和进程状态。它可以帮助你快速了解 CPU、内存、负载等信息&#xff0c;是系统管理员和开发者的日常利器。本文将从基本用法开始…

uniapp-x vue 特性

生命周期 在组合式API中&#xff0c;组件可以监听应用和页面的生命周期。但由于应用和页面都有onShow和onHide&#xff0c;导致重名。所以在组合式的组件中监听页面的显示隐藏&#xff0c;改为了onPageShow和onPageHide。 这个和uniapp不一样&#xff0c;uniapp自定义组件无法…

HTML5扫雷游戏开发实战

HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…

Qt之自定义界面组件 一

通过qt中的painter绘图事件绘制一个电池电量图的变化。效果如下图 创建一个基于界面widget工程&#xff0c;在wdiget界面添加一个widget界面,将添加的widget界面的类提升为Tbattery.在Tbattery类中重写painEvent电池电量代码 文件目录结构 主要部分代码 //Tbattery.cpp #inc…

LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0

前言 过去2年多的深入超过此前7年&#xff0c;全靠夜以继日的勤奋&#xff0c;一天当两天用&#xff0c;抠论文 抠代码 和大模型及具身同事讨论&#xff0c;是目前日常 而具身库里&#xff0c;idp3、π0、lerobot值得反复研究&#xff0c;故&#xff0c;近期我一直在抠π0及l…