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

为什么要使用stream流

总的来说就是

它支持链式调用,方便

不会修改原始数据源,而是生成一个新的流或结果

中间操作不会立即执行,只有在终端操作触发时才会真正执行

注意事项

  • 无状态操作:Stream 操作应该是无状态的,不要依赖外部变量的状态。
  • 副作用:避免在 Stream 操作中修改外部变量,可能导致不确定的行为。
  • 线程安全:并行流可能会导致线程安全问题,需谨慎使用。

以下是相关知识点:

Java 8 引入了 Stream API,它提供了一种高效且简洁的方式来处理集合数据。Stream 是一种抽象,它允许你以声明式的方式处理数据集合(如 List、Set 等)。Stream API 的设计灵感来源于函数式编程语言,并结合了 Java 的特性。


1. Stream 的核心概念

(1)什么是 Stream?
  • 定义:Stream 是一个来自数据源的元素序列,支持顺序和并行的聚合操作。
  • 特点
    • 惰性求值(Lazy Evaluation):Stream 的中间操作不会立即执行,只有在终端操作触发时才会真正执行。
    • 不可变性:Stream 操作不会修改原始数据源,而是生成一个新的流或结果。
    • 链式调用:Stream 支持链式调用,可以将多个操作串联起来。
(2)Stream 的生命周期

Stream 的生命周期分为三个阶段:

  1. 创建 Stream:从数据源(如集合、数组、文件等)创建一个 Stream。
  2. 中间操作(Intermediate Operations):对 Stream 进行一系列转换操作(如过滤、映射等),返回一个新的 Stream。
  3. 终端操作(Terminal Operations):触发 Stream 的执行并生成最终结果(如收集到集合中、计算总数等)。

2. Stream 的创建方式

(1)从集合创建

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); // 创建顺序流
Stream<String> parallelStream = list.parallelStream(); // 创建并行流
(2)从数组创建

String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
(3)使用 Stream.of

Stream<String> stream = Stream.of("a", "b", "c");
(4)生成无限流
  • Stream.generate:生成一个无限流。
Stream<Double> randomStream = Stream.generate(Math::random);
  • Stream.iterate:基于初始值和递增规则生成一个无限流。
Stream<Integer> evenNumbers = Stream.iterate(0, n -> n + 2);

3. Stream 的中间操作

中间操作会返回一个新的 Stream,它们是惰性的,只有在终端操作触发时才会执行。

(1)filter
  • 作用:过滤掉不符合条件的元素。
  • 示例
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);Stream<Integer> filtered = numbers.filter(n -> n % 2 == 0); // 只保留偶数
(2)map
  • 作用:将每个元素映射为另一个元素。
  • 示例
Stream<String> words = Stream.of("apple", "banana", "cherry");Stream<Integer> lengths = words.map(String::length); // 获取每个单词的长度
(3)flatMap
  • 作用:将每个元素映射为一个流,然后将所有流合并为一个流。
  • 示例
List<List<Integer>> nestedList = Arrays.asList(Arrays.asList(1, 2),Arrays.asList(3, 4));Stream<Integer> flatStream = nestedList.stream().flatMap(List::stream);
(4)distinct
  • 作用:去重,返回一个不包含重复元素的流。
  • 示例
Stream<Integer> numbers = Stream.of(1, 2, 2, 3, 3);Stream<Integer> distinctNumbers = numbers.distinct();
(5)sorted
  • 作用:排序流中的元素。
  • 示例
Stream<Integer> numbers = Stream.of(3, 1, 2);Stream<Integer> sortedNumbers = numbers.sorted();
(6)limitskip
  • 作用
    • limit(n):截取前 n 个元素。
    • skip(n):跳过前 n 个元素。
  • 示例
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);Stream<Integer> limited = numbers.limit(3); // 取前 3 个元素Stream<Integer> skipped = numbers.skip(2);  // 跳过前 2 个元素

4. Stream 的终端操作

终端操作会触发 Stream 的执行,并生成最终结果。

(1)forEach
  • 作用:遍历流中的每个元素。
  • 示例
Stream<String> words = Stream.of("hello", "world");words.forEach(System.out::println);
(2)collect
  • 作用:将流中的元素收集到集合或其他数据结构中。
  • 示例
Stream<String> words = Stream.of("a", "b", "c");List<String> list = words.collect(Collectors.toList());
(3)reduce
  • 作用:通过某种操作将流中的元素合并为一个值。
  • 示例
Stream<Integer> numbers = Stream.of(1, 2, 3, 4);Optional<Integer> sum = numbers.reduce((a, b) -> a + b); // 计算总和
(4)anyMatchallMatchnoneMatch
  • 作用
    • anyMatch:判断是否有任意一个元素满足条件。
    • allMatch:判断是否所有元素都满足条件。
    • noneMatch:判断是否没有任何元素满足条件。
  • 示例
Stream<Integer> numbers = Stream.of(1, 2, 3, 4);boolean anyEven = numbers.anyMatch(n -> n % 2 == 0); // 是否有偶数
(5)count
  • 作用:统计流中的元素数量。
  • 示例
Stream<Integer> numbers = Stream.of(1, 2, 3, 4);long count = numbers.count(); // 统计元素数量
(6)findFirstfindAny
  • 作用
    • findFirst:返回流中的第一个元素(如果存在)。
    • findAny:返回流中的任意一个元素(通常用于并行流)。
  • 示例
Stream<Integer> numbers = Stream.of(1, 2, 3, 4);Optional<Integer> first = numbers.findFirst();

5. 惰性求值(Lazy Evaluation)

Stream 的中间操作是惰性的,只有在终端操作触发时才会真正执行。这种机制的优点包括:

  • 性能优化:避免不必要的计算。
  • 短路操作:某些操作(如 findFirstanyMatch)可以在满足条件后立即停止。

6. 并行流(Parallel Streams)

  • 定义:并行流利用多核处理器的能力,将任务分解为多个子任务并行执行。
  • 示例
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();

7. 注意事项

  • 无状态操作:Stream 操作应该是无状态的,不要依赖外部变量的状态。
  • 副作用:避免在 Stream 操作中修改外部变量,可能导致不确定的行为。
  • 线程安全:并行流可能会导致线程安全问题,需谨慎使用。

8. 总结

Stream API 提供了一种强大而灵活的方式来处理集合数据,它的主要优势包括:

  • 简洁性:代码逻辑清晰,易于理解。
  • 高效性:支持惰性求值和并行处理,提高性能。
  • 可扩展性:支持链式调用,可以轻松添加更多操作。

如果你需要处理复杂的集合操作(如过滤、映射、分组等),Stream API 是非常推荐的工具。

相关文章:

为什么要使用stream流

总的来说就是 它支持链式调用&#xff0c;方便 不会修改原始数据源&#xff0c;而是生成一个新的流或结果 中间操作不会立即执行&#xff0c;只有在终端操作触发时才会真正执行 注意事项 无状态操作&#xff1a;Stream 操作应该是无状态的&#xff0c;不要依赖外部变量的状…...

语义分割的image

假设图像的尺寸为 3x3&#xff0c;并且是 RGB 图像&#xff08;有 3 个通道&#xff09;。每个通道的像素值范围为 [0, 1]&#xff0c;我们将构造一个 batch_size 2 的图像批次。 Image: tensor([[[[0.1347, 0.4583, 0.7102], # 第一张图像的红色通道[0.1774, 0.0328, 0.308…...

云原生安全之网络IP协议:从基础到实践指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 IP协议&#xff08;Internet Protocol&#xff09;是互联网通信的核心协议族之一&#xff0c;负责在设备间传递数据包。其核心特性包括&…...

C++——QT 文件操作类

QFile 概述 QFile是Qt框架中用于文件操作的类&#xff08;位于QtCore模块&#xff09;&#xff0c;继承自 QIODevice&#xff0c;提供文件的读写、状态查询和路径管理功能。它与 QTextStream、QDataStream 配合使用&#xff0c;可简化文本和二进制数据的处理&#xff0c;并具备…...

【排错】kylinLinx环境python读json文件报错UTF-8 BOM

kylin Linux环境python读json文件报错UTF-8 BOM 报错描述&#xff1a; windows环境下,python代码读取json文件正常&#xff0c;但是sftp到linux环境下 报错信息&#xff1a; json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column …...

[spring] spring 框架、IOC和AOP思想

目录 传统Javaweb开发的困惑 loC、DI和AOP思想提出 Spring框架的诞生 传统Javaweb开发的困惑 问题一&#xff1a;层与层之间紧密耦合在了一起&#xff0c;接口与具体实现紧密耦合在了一起 解决思路&#xff1a;程序代码中不要手动new对象&#xff0c;第三方根据要求为程序提…...

LInux—shell编程

一、Shell 编程核心特性 解释型语言 无需编译&#xff0c;直接由 bash、sh 等解释器逐行执行。 类似 PHP 的解释执行&#xff0c;不同于 C 的编译型。 系统命令集成 可直接调用 Linux 命令&#xff08;如 ls、grep、awk&#xff09;&#xff0c;实现系统管理自动化。 与 C/…...

尚硅谷redis7 37-39 redis持久化之AOF简介

37 redis持久化之AOF简介 AOF 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工…...

GitLab 备份所有仓库(自动克隆)

一、准备工作 1. 环境要求 已安装 Git&#xff08;版本 2.10&#xff09;本地磁盘空间充足&#xff08;根据仓库总大小预估&#xff09;已配置 SSH 密钥到 GitLab&#xff08;推荐方式&#xff09; 2. 获取 GitLab API 访问权限 登录 GitLab&#xff0c;点击右上角头像 → …...

[浏览器]缓存策略机制详解

在做页面性能优化的时候&#xff0c;有一个点容易被忽略&#xff0c;那就是资源缓存优化。 浏览器里缓存策略分为强缓存&#xff0c;协商缓存以及不缓存&#xff0c;每个缓存策略都有其适用的优化场景。 下面为大家详解何为强缓存&#xff0c;协商缓存 先说结论强缓>协商&g…...

Vue修饰符全解析

目录 一、事件修饰符 二、按键修饰符 三、系统修饰键 四、表单修饰符 五、鼠标修饰符 六、特殊修饰符 七、自定义修饰符 使用建议 一、事件修饰符 <!-- 阻止冒泡 --> <button click.stop"handleClick">点击测试</button><!-- 阻止默认行…...

OpenCV CUDA 模块图像过滤-----创建一个计算图像导数的滤波器函数createDerivFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::createDerivFilter 是 OpenCV CUDA 模块中的一个工厂函数&#xff0c;用于创建一个计算图像导数的滤波器。这个滤波器可以用来计算图像…...

计算机视觉与深度学习 | Python实现CEEMDAN-ABC-VMD-DBO-CNN-LSTM时间序列预测(完整源码和数据)

以下是一个结合CEEMDAN、ABC优化VMD、DBO优化CNN-LSTM的完整时间序列预测实现方案。该方案包含完整的数据生成、算法实现和模型构建代码。 完整实现代码 import numpy as np import pandas as pd from PyEMD import CEEMDAN from vmdpy import VMD from sklearn.preprocessing…...

AWS関連職種向け:日本語面接QA集

1. 自己紹介&#xff08;じこしょうかい&#xff09; Q&#xff1a;簡単に自己紹介をお願いします。 A&#xff1a; はい、〇〇と申します。これまで約4年間、主にAWSを基盤としたインフラ設計・構築・運用に従事してまいりました。VPCやEC2、RDS、S3などの基本サービスの設計…...

【Macos】安装前端环境rust+node环境

Macos 安装前端环境 1、findar 新建目录 projects 2、安装brew 使用中科大镜像, 手动配置path 3、brew install git 4、 git clone githttp://10.10.9.201/software/dreame_sorting_app.git 5、安装vscode/hbuilderx/node 6、rustup切换镜像并安装https://rsproxy.cn/#getStart…...

(01)华为GaussDB((基于PostgreSQL))高斯数据库使用记录,dbeaver客户端配置高斯驱动,连接高斯数据库

高斯数据库是华为推出的一款基于PostgreSQL的企业级数据库产品&#xff0c;客户端使用通用的dbeaver dbeaver客户端配置高斯驱动 建议使用 dbeaver24.3.1及以上客户端&#xff0c;选择模式后执行sql会绑定模式名&#xff0c;如果使用dbeaver23.2版本&#xff0c;选择模式后执…...

ARM Linux远程调试

准备 虚拟机既能ping通开发板,又能ping通外网,还要能ping通Windows主机(如果你有上位机通信(tftp、vsftp、ssh)的需求) VMware 添加网络适配器2用作桥接网卡,原有的网络适配器保持为NAT模式 打开虚拟网络编辑器,配置VMnet0为桥接模式,外部连接设置为Realtek PCIe G…...

day24Node-node的Web框架Express

1. Express 基础 1.1 什么是Express node的web框架有Express 和 Koa。常用Express 。 Express 是一个基于 Node.js 的快速、极简的 Web 应用框架,用于构建 服务器端应用(如网站后端、RESTful API 等)。它是 Node.js 生态中最流行的框架之一,以轻量、灵活和易用著称。 …...

Webpack和Vite构建工具有什么区别?各自的优缺点是什么

Webpack 和 Vite 是两种主流的前端构建工具,分别代表了不同的设计理念和技术路线。以下是它们的核心区别和优缺点对比: 一、核心区别 维度WebpackVite设计理念基于打包(Bundle-Based)基于原生 ESM(Native ESM)开发模式全量打包后启动按需编译 + 浏览器直接加载 ESM构建工…...

让MySQL更快:EXPLAIN语句详尽解析

前言 在数据库性能调优中&#xff0c;SQL 查询的执行效率是影响系统整体性能的关键因素之一。MySQL 提供了强大的工具——EXPLAIN 语句&#xff0c;帮助开发者和数据库管理员深入分析查询的执行计划&#xff0c;从而发现潜在的性能瓶颈并进行针对性优化。 EXPLAIN 语句能够模…...

基于谷歌浏览器的Web Crypto API生成一对2048位的RSA密钥(公钥+私钥),并以JSON格式(JWK)打印到浏览器控制台

用Google Chrome 浏览器的Web Crypto API生成RSA密钥对&#xff1a;在浏览器环境中生成一对2048位的RSA密钥(公钥私钥)&#xff0c;然后以JSON格式(JWK)将它们打印到控制台&#xff0c;方便开发者查看和使用。 // 控制台生成密钥对 (async () > {// 调用Web Crypto API生成…...

[CSS3]rem移动适配

前言 什么是移动端适配? 让页面的元素在屏幕尺寸变化时, 同比放大或缩小 移动适配的方案 rem&#xff1a;目前多数企业在用的解决方案 vw/vh&#xff1a;未来的解决方案 rem 体验rem适配 目标: 能够使用rem单位设置网页元素的尺寸 网页效果: 屏幕宽度不同&#xff0c;网…...

向量数据库及ChromaDB的使用

什么是向量数据库&#xff1f; 向量数据库&#xff08;Vector Database&#xff09;&#xff0c;也叫矢量数据库&#xff0c;主要用来存储和处理向量数据。 在数学中&#xff0c;向量是有大小和方向的量&#xff0c;可以使用带箭头的线段表示&#xff0c;箭头指向即为向量的方…...

CodeBuddy实现pdf批量加密

本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前言 在信息爆炸的时代&#xff0c;PDF 格式因其跨平台性和格式稳定性&#xff0c;成为办公、学术、商业等领域传递信息的重要载体。从机密合同到个人隐私文档&#xff0c…...

编程中优秀大模型推荐:特点与应用场景深度分析

编程中优秀大模型推荐&#xff1a;特点与应用场景深度分析 编程中优秀大模型推荐&#xff1a;特点与应用场景深度分析GPT系列模型模型概述技术特点编程应用场景 DeepSeek系列模型模型概述技术特点编程应用场景 Claude系列模型模型概述技术特点编程应用场景 Llama系列模型模型概…...

orm详解--查询执行

深入解析 Django ORM 查询执行阶段 的核心机制&#xff0c;包括查询集的惰性特性、表达式树构建、SQL 编译过程及优化原理。以下是详细分析&#xff1a; 一、查询集&#xff08;QuerySet&#xff09;的惰性执行机制 1. 惰性特性的底层实现 核心类&#xff1a;django.db.mode…...

运行打印Hello World启动了多少线程?

序言 看网上说阿里二面问到了一个看似最简单且没有标准答案的一个问题&#xff0c;所有学习编程都是从打印hello World开始的&#xff0c;那运行打印启动了多少个线程&#xff1f; 启动了多少线程&#xff1f; 在运行一个简单的 “Hello World” 程序时&#xff0c;启动的线…...

C++项目中调用C#DLL的的方式

C项目中调用C&#xff03;DLL的的方式 方法一&#xff1a;使用COM技术方法二&#xff1a;使用C/CLI方法三&#xff1a;使用P/Invoke&#xff08;适用于C#导出非托管接口&#xff09; 在C中调用C#编写的DLL&#xff0c;通常需要借助COM&#xff08;Component Object Model&#…...

咳嗽止咳药笔记250526 , 磷酸苯丙哌林 , 喷托维林 , 右美沙芬

咳嗽止咳药笔记250526 止咳药的种类较多&#xff0c;根据作用机制可分为中枢性止咳药、外周性止咳药、祛痰药、抗组胺药及中成药等。以下是具体分类及效果分析&#xff1a; 一、中枢性止咳药 可待因 效果&#xff1a;直接抑制延髓咳嗽中枢&#xff0c;镇咳作用强且迅速&#x…...

vue pinia 独立维护,仓库统一导出

它允许您跨组件/页面共享状态 持久化 安装依赖pnpm i pinia-plugin-persistedstate 将插件添加到 pinia 实例上 pinia独立维护 统一导出 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia creat…...