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

Stream特性(踩坑):惰性执行、不修改原始数据源

在日常开发中,Stream API 提供了一种高效且易于使用的工具集来处理集合数据。

本文主要讲解 Stream 的两个特性:惰性执行不修改原始数据源

为什么说这两个、而不讲下其他的特性呢?主要是因为在开发中如果忽略这两个特性的话,使用 Stream 写出来的代码就可能 Bug 多多啊,因此在这里特别强调下。

1.惰性执行

1.1.说明

惰性执行 意味着 Stream 的中间操作(intermediate operations,如filter, map)不会立即执行,而是在遇到终止操作(terminal operations,如forEach, collect)时才会触发。

1.2.反例

考虑以下代码:
List<String> words = Arrays.asList("apple", "banana", "cherry");
words.stream().filter(word -> {System.out.println("Filtering: " + word);return word.startsWith("a");});

以上代码执行后并不会有打印输出,这是因为尽管调用了中间操作 filter,但是 filter 后并没有调用终止操作的方法。

1.3.正确使用

应该习惯性地在流操作的最后,都调用一个终止操作

例如:

words.stream().filter(word -> word.startsWith("a")).forEach(System.out::println);

1.3.1.如何区分中间操作和终止操作

这其实很简单,如果一个方法的返回结果为一个新的流 (Stream),那么它是中间操作,否则就是终止操作。

2.不修改原始数据源

2.1.说明

Stream 的操作并不会改变原始数据,Stream 操作都是基于原始数据创建新的结果

2.2.反例

假设有如下代码:
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3));
numbers.stream().map(n -> n * 2).collect(Collectors.toList());System.out.println(numbers); // 输出 [1, 2, 3]

可能有人会错误地认为,Stream 操作执行后,numbers列表的元素会发生改变,然后就把numbers作为计算后的结果接着往下执行逻辑。

但实际上,Stream 操作的结果是生成了一个新的集合,而原始的集合numbers保持不变。

2.3.正确使用

应该用一个新对象接收 Stream 操作的结果,后续如果需要使用计算后的结果,使用的应该是这个新的对象,而不是原始的数据集合。

List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> doubledNumbers = numbers.stream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(doubledNumbers); // 输出 [2, 4, 6]

又或者,可以直接用 Stream 操作的结果覆盖掉原始的数据对象。

List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3));
numbers = numbers.stream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(numbers); // 输出 [2, 4, 6]

如果有帮助的话,可以点个赞支持一下嘛🙏

相关文章:

Stream特性(踩坑):惰性执行、不修改原始数据源

在日常开发中&#xff0c;Stream API 提供了一种高效且易于使用的工具集来处理集合数据。 本文主要讲解 Stream 的两个特性&#xff1a;惰性执行&#xff0c;不修改原始数据源。 为什么说这两个、而不讲下其他的特性呢&#xff1f;主要是因为在开发中如果忽略这两个特性的话&…...

springcloud sentinel教程

‌QPS&#xff08;Queries Per Second&#xff09;即每秒查询率 TPS&#xff0c;每秒处理的事务数目 PV&#xff08;page view&#xff09;即页面浏览量 UV 访问数&#xff08;Unique Visitor&#xff09;指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…...

像素的一生 Life of a Pixel - Steve Kobes 2020版

像素的一生 Life of a Pixel - Steve Kobes 2020版 《Life of a Pixel》 作者是Google大佬 Steve Kobes 2020年 介绍Chromium内核完整渲染流程的视频&#xff0c;介绍的非常好&#xff0c;想要学习了解chromium内核渲染必看&#xff01; 油管视频地址为&#xff1a;https://w…...

系统部署【信创名录】及其查询地址

一、信创类型 &#xff08;一&#xff09;服务器&#xff1a; 1.华为云 2.腾讯云 3.阿里云 &#xff08;二&#xff09;中央处理器&#xff08;CPU&#xff09;&#xff1a; 1.海思&#xff0c;鲲鹏920服务器 &#xff08;三&#xff09;中间件 1.人大金仓 &#xff0…...

VSCode 配置优化指南:打造高效的 uni-app、Vue2/3、JS/TS 开发环境

VSCode 配置优化指南,适用于 uni-app、Vue2、Vue3、JavaScript、TypeScript 开发,包括插件推荐、设置优化、代码片段、调试配置等,确保你的开发体验更加流畅高效。 1. 安装 VSCode 如果你还未安装 VSCode,可前往 VSCode 官网 下载最新版并安装。 2. 安装推荐插件 (1) Vue…...

C++中的析构函数

目录 一、什么是析构函数&#xff1a; 二、析构函数的特性&#xff1a; 一、什么是析构函数&#xff1a; C中的析构函数非常简单&#xff0c;它的功能无非是帮助我们自动归还堆区的空间给操作系统。当我们使用内存开辟函数&#xff08;如malloc()、realloc()&#xff09;等&a…...

同步,异步,并发,并行

同步: 任务按顺序执行&#xff0c;必须等待前一个任务完成后才能开始下一个任务。 任务之间是强依赖的&#xff0c;通过直接调用或阻塞等待实现。 示例&#xff1a;读取文件时&#xff0c;代码会阻塞直到文件读取完成。 异步&#xff1a; 任务无需等待前一个任务完成即可启…...

种子填充(Floodfill、泛滥填充、洪水填充) 算法c++模板

种子填充(Floodfill) 算法: 从任意 W 开始,不停地把邻接的 W 用 . 代替。1 次 DFS 后与初始 W 连接的所有 W 都被替换成 . 了。 因此,直到图中不存在 W 为止,总共进行 DFS 的次数就是答案了。 问题: 有一个大小为 N x M 的园子,雨后积水。 8 连通的积水被认为是连接在…...

MATLAB控制函数测试要点剖析

一、功能准确性检验 基础功能核验 针对常用控制函数&#xff0c;像用于传递函数建模的 tf 、构建状态空间模型的 ss &#xff0c;以及开展阶跃响应分析的 step 等&#xff0c;必须确认其能精准执行基础操作。以 tf 函数为例&#xff0c;在输入分子与分母系数后&#xff0c;理…...

【新手指南】pyqt可视化远程部署deepseek7B蒸馏版模型

本地效果&#xff1a;&#xff08;如果想做这个的本科毕设&#xff0c;建议美化界面。&#xff09; 总结&#xff1a;MobaXterm远程连接autodl服务器&#xff0c;在MobaXterm上利用X11转发使pyqt可视化页面在自己的电脑上展现出来。 1. 官网下载MobaXterm MobaXterm free Xse…...

大语言模型在患者交互任务中的临床使用评估框架

An evaluation framework for clinical use of large language models in patient interaction tasks An evaluation framework for clinical use of large language models in patient interaction tasks | Nature Medicine 2025.1 收到时间&#xff1a;2023 年 8 月 8 日 …...

DeepSeek-V3 技术报告解读

DeepSeek火了有一段时间了&#xff0c;春节假期因为没时间&#xff0c;所以关于deepseek大模型一系列的技术报告一直没看&#xff0c;新年开工后&#xff0c;抽一点时间把之前的坑补起来&#xff0c;关于DeepSeek-V3技术报告的解读已经有很多了&#xff0c;但我相信不同的人去读…...

suricata安装测试

系统版本为Ubuntu 22.04.4。 # cat /etc/issue Ubuntu 22.04.4 LTS \n \l # # uname -a Linux logging 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov 6 17:42:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux添加suricata的apt库。 # add-apt-repository pp…...

Java反射简单理解

Java反射是指在运行时&#xff08;runtime&#xff09;能够动态地获取类的内部信息&#xff0c;并能直接操作类的属性和方法的一种机制。通过反射&#xff0c;开发者可以在运行时检查类、接口、字段和方法&#xff0c;并且可以调用这些方法和访问这些字段&#xff0c;而无需在编…...

WPS Word中英文混杂空格和行间距不一致调整方案

文章目录 问题1&#xff1a;在两端对齐的情况下&#xff0c;如何删除参考文献&#xff08;英文&#xff09;的空格问题2&#xff1a;中英文混杂行间距不一致问题问题3&#xff1a;设置中文为固定字体&#xff0c;设置西文为固定字体参考 问题1&#xff1a;在两端对齐的情况下&a…...

探秘沃尔什-哈达玛变换(WHT)原理

沃尔什-哈达玛变换&#xff08;WHT&#xff09;起源 起源与命名&#xff08;20世纪早期&#xff09; 数学基础&#xff1a;该变换的理论基础由法国数学家雅克哈达玛&#xff08;Jacques Hadamard&#xff09;在1893年提出&#xff0c;其核心是哈达玛矩阵的构造。扩展与命名&…...

优雅拼接字符串:StringJoiner 的完整指南

在Java开发中&#xff0c;字符串拼接是高频操作。无论是日志格式化、构建CSV数据&#xff0c;还是生成动态SQL&#xff0c;开发者常需处理分隔符、前缀和后缀的组合。传统的StringBuilder虽然灵活&#xff0c;但代码冗余且易出错。Java 8推出的StringJoiner类&#xff0c;以简洁…...

AFL++安装

学习fuzzing也几天了&#xff0c;今天记录AFL的安装及使用 一、实验环境 虚拟机&#xff1a;ubuntu20.04 当然也可以uname -a去看自己的版本号 二、AFL安装 1.先更新一下工具 sudo apt update2.安装AFL必要的一些依赖&#xff0c;例如编译工具&#xff08;如 build-essen…...

开发者社区测试报告(功能测试+性能测试)

功能测试 测试相关用例 开发者社区功能背景 在当今数字化时代&#xff0c;编程已经成为一项核心技能&#xff0c;越来越多的人开始学习编程&#xff0c;以适应快速变化的科技 环境。基于这一需求&#xff0c;我设计开发了一个类似博客的论坛系统&#xff0c;专注于方便程序员…...

如何优化 VS Code 远程开发环境?高效配置与性能提升策略

相关系列文章 《新手教学系列——善用 VSCode 工作区,让开发更高效》 《新手教学系列——用 VSCode 实现高效远程开发》 《Webpack 优化全攻略:彻底解决 Vue 项目 npm run dev 的内存泄露问题》 引言 随着开发环境不断进化,VS Code 作为一款轻量级的代码编辑器,已经成为…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...