关于(stream)流

Stream 是 Java 8 引入的一个强大的功能,用于处理集合(Collection)或数组中的数据。它提供了一种声明式的编程方式,可以极大地简化对数据的操作,例如过滤、排序、映射和聚合等。



1. 什么是 Stream 流?

  • 定义Stream 是一个来自数据源(如集合、数组等)的元素序列,支持顺序和并行操作。
  • 特点
    • 惰性求值(Lazy Evaluation):Stream 的中间操作不会立即执行,只有在终端操作触发时才会真正执行。
    • 不可变性:Stream 操作不会修改原始数据源,而是生成新的流或结果。
    • 链式调用:多个操作可以通过链式调用的方式组合在一起。


2. Stream 的工作流程

使用 Stream 流通常分为以下三个步骤:

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


3. 创建 Stream

可以通过多种方式创建 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<String> stream = Stream.of("A", "B", "C");// 创建一个空流
Stream<String> emptyStream = Stream.empty();


4. 中间操作

中间操作是对流中的数据进行处理,返回一个新的流。常见的中间操作包括:

(1)过滤(filter
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 过滤出偶数
Stream<Integer> filteredStream = numbers.stream().filter(n -> n % 2 == 0);
(2)映射(map
List<String> words = Arrays.asList("apple", "banana", "cherry");// 将每个单词转换为大写
Stream<String> upperCaseStream = words.stream().map(String::toUpperCase);
(3)排序(sorted
List<Integer> numbers = Arrays.asList(5, 3, 8, 1);// 升序排序
Stream<Integer> sortedStream = numbers.stream().sorted();// 自定义排序规则
Stream<Integer> customSortedStream = numbers.stream().sorted(Comparator.reverseOrder());
(4)去重(distinct
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4);// 去重后的流
Stream<Integer> distinctStream = numbers.stream().distinct();
(5)限制和跳过(limitskip
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 取前 3 个元素
Stream<Integer> limitedStream = numbers.stream().limit(3);// 跳过前 2 个元素
Stream<Integer> skippedStream = numbers.stream().skip(2);


5. 终端操作

终端操作会触发流的执行,并生成最终结果。常见的终端操作包括:

(1)收集结果(collect
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 收集为 List
List<Integer> result = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());// 收集为 Set
Set<Integer> resultSet = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toSet());
(2)统计信息(countminmax 等)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 统计元素个数
long count = numbers.stream().count();// 查找最大值
Optional<Integer> max = numbers.stream().max(Integer::compareTo);// 查找最小值
Optional<Integer> min = numbers.stream().min(Integer::compareTo);
(3)遍历(forEach
List<String> words = Arrays.asList("apple", "banana", "cherry");// 打印每个单词
words.stream().forEach(System.out::println);
(4)判断条件(anyMatchallMatchnoneMatch
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 是否存在偶数
boolean hasEven = numbers.stream().anyMatch(n -> n % 2 == 0);// 是否所有元素都是偶数
boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0);// 是否没有偶数
boolean noEven = numbers.stream().noneMatch(n -> n % 2 == 0);


6. 并行流

Java 8 提供了并行流(Parallel Stream),可以利用多核 CPU 并行处理数据:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用并行流计算总和
int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
  • 优点:对于大数据量的操作,可以显著提高性能。
  • 缺点:并行流可能会引入线程安全问题,且不一定总是比串行流快。


7. Stream 的注意事项

  • 一次性消费:Stream 流只能被消费一次,再次使用需要重新创建。
  • 避免副作用:尽量避免在 Stream 操作中修改外部状态,保持函数式编程的纯函数特性。
  • 性能优化:合理选择中间操作和终端操作,避免不必要的复杂操作。


8. 总结

Stream 是 Java 8 中非常重要的特性,能够极大地简化集合操作。它的主要优势包括:

  • 简洁性:通过链式调用实现复杂的操作逻辑。
  • 可读性:代码更加直观,易于理解。
  • 高效性:支持并行流,充分利用多核 CPU 性能。

如果你需要处理集合或数组中的数据,推荐优先考虑使用 Stream 流来实现

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

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

相关文章

结课作业自选01. 内核空间 MPU6050 体感鼠标驱动程序(二)(完整实现流程)

目录 一. 题目要求-内核空间 MPU6050 体感鼠标驱动程序 二. 伪代码及程序运行流程 三. 主要函数详解&#xff08;根据代码流程进行详解&#xff09; 3.1 module_i2c_driver宏&#xff08;对应“1”&#xff09; 3.2 mpu_of_match设备树匹配表&#xff08;对应“2”&#x…

5G 核心网切换机制全解析:XN、N2 与移动性注册对比

摘要 本文深入探讨了 5G 核心网中的三种关键切换方式:基于 XN 接口的切换、基于 N2 接口的切换以及移动性注册更新机制。通过对比分析它们的原理、应用场景和技术差异,帮助读者全面理解 5G 网络中用户移动性管理的核心技术。 1. 引言 随着 5G 技术的广泛应用,用户对网络连…

用深度学习提升DOM解析——自动提取页面关键区块

一、时间轴&#xff1a;一次“抓不到重点”的二手车数据爬虫事故 2025/03/18 09:00 产品经理希望抓取懂车帝平台上“北京地区二手车报价”作为竞品监测数据源。我们初步使用传统XPath方案&#xff0c;试图提取车型、年限、里程、价格等数据。2025/03/18 10:00 初版脚本运行失败…

React与Vue的内置指令对比

React 与 Vue 不同&#xff0c;它没有内置的模板指令系统。React 采用了 JavaScript 优先 的声明式方式&#xff0c;使用 JSX 语法将 HTML 和 JavaScript 结合在一起。因此&#xff0c;React 中没有类似 Vue 的 v-if、v-for、v-bind 等内置指令。 React 中的替代方案 条件渲染…

Spring声明式事务源码全链路剖析与设计模式深度解读

Spring声明式事务源码全链路剖析与设计模式深度解读 作者&#xff1a;AI 日期&#xff1a;2025-05-22 一、前言 Spring事务是企业级开发的基石&#xff0c;但“为什么有时事务失效&#xff1f;”、“不同传播行为背后发生了什么&#xff1f;”、“Spring事务源码到底如何实现&…

云原生安全基础:深入探讨容器化环境中的权限隔离与加固策略

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 在云原生环境中&#xff0c;容器化技术&#xff08;如 Docker 和 Kubernetes&#xff09;的广泛应用带来了灵活性与效率&#xff0c;但也引入了新的安全挑…

如何在 ONLYOFFICE 演示文稿中调整段落首行缩进

在制作演示文稿时&#xff0c;保持内容的一致性与可读性至关重要&#xff0c;而段落首行缩进作为格式设置的关键环节&#xff0c;直接影响着整体呈现效果。在本文中&#xff0c;我们将介绍如何通过创建 ONLYOFFICE 宏&#xff0c;快速设置演示文稿中所有段落的首行缩进。 关于 …

[Asp.Net]GridView、Repeater 导出Excel长数字显示成科学计数

类似身份证纯数字的格式时 &#xff0c;excel默认是数字格式 变成了科学计数法 &#xff0c; GridView:RowDataBound 添加e.Row.Cells[2].Attributes.Add(“style”, “vnd.ms-excel.numberformat:;”); protected void GridView1_RowDataBound(object sender, GridViewRowE…

Ntfs!NtfsReadBootSector函数分析之nt!CcGetVacbMiss中得到一个nt!_VACB结构

第一部分&#xff1a; 1: kd> g Breakpoint 3 hit nt!CcGetVacbMiss: 80a1a19e 6a30 push 30h 1: kd> kc # 00 nt!CcGetVacbMiss 01 nt!CcGetVirtualAddress 02 nt!CcMapData 03 Ntfs!NtfsMapStream 04 Ntfs!NtfsReadBootSector Ntfs…

Linux10正式版发布,拥抱AI了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…

关于 SSE(Server-Sent Events)过程的简要解剖

Js前端&#xff1a;发送普通请求 fetch(...) .then(()>{}) .catch(()>{})Java后端&#xff1a;接收请求后调用请求处理函数&#xff0c;函数返回一个emiiter对象 public SseEmitter handleRequest(...) {// 创建一个 SseEmitter 对象&#xff0c;用于发送 SSE 事件SseE…

PyTorch 中unsqueeze(-1)用法

unsqueeze(-1) 是 PyTorch 中的一个张量操作&#xff0c;用于‌在指定维度上增加一个长度为1的维度‌&#xff08;即扩展维度&#xff09;。具体解析如下&#xff1a; 功能说明 ‌作用位置‌ -1 表示在张量的‌最后一个维度‌后添加新维度。 &#xff08;等价于 dimlen(tensor.…

RTC技术

什么是RTC RTC&#xff08;Real time communication&#xff09;实时通信&#xff0c;是实时音视频的一个简称&#xff0c;我们常说的RTC技术一般指的是WebRTC技术&#xff0c;已经被 W3C 和 IETF 发布为正式标准。由于几乎所有主流浏览器都支持 WebRTC 标准 API &#xff0c;…

vue+cesium示例:3Dtiles三维模型高度调整(附源码下载)

接到一位知识星友的邀请&#xff0c;实现他需要3Dtiles三维模型的简单高度调整需求&#xff0c;适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境&#xff1a;依赖Node安装环境&#xff0c;demo本地Node版本:推荐v18。 运行工具&#xff1a;…

详解3DGS

4 可微分的3D高斯 splatting 核心目标与表示选择 我们的目标是从无法线的稀疏SfM点出发&#xff0c;优化出一种能够实现高质量新视角合成的场景表示。为此&#xff0c;我们选择3D高斯作为基本图元&#xff0c;它兼具可微分的体表示特性和非结构化的显式表示优势&#xff0c;既…

构建版本没mac上传APP方法

在苹果开发者的app store connect上架Ios应用的时候&#xff0c;发现需要使用xode等软件来上传iOS的APP。 但是不管是xcode也好&#xff0c;transporter也好&#xff0c;还是命令行工具也好&#xff0c;都必须安装在mac电脑才能使用&#xff0c;。 假如没有mac电脑&#xff0…

Gitee PPM:智能化项目管理如何重塑软件工厂的未来格局

在数字化转型浪潮席卷全球的当下&#xff0c;软件开发行业正经历着前所未有的变革。随着企业项目复杂度呈指数级增长&#xff0c;传统项目管理方式已难以应对多项目并行、跨团队协作等挑战。Gitee项目组合管理&#xff08;PPM&#xff09;作为新一代智能化项目管理解决方案&…

node入门:安装和npm使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装npm命令nvm 前言 因为学习vue接触的&#xff0c;一直以为node是和vue绑定的&#xff0c;还以为vue跑起来必须要node&#xff0c;后续发现并不是。 看…

单例模式,饿汉式,懒汉式,在java和spring中的体现

目录 饿汉式单例模式 懒汉式单例模式 Spring中的单例模式 关键差异对比 在Java和Spring中的应用场景 手写案例 单例模式是一种创建型设计模式&#xff0c;其核心在于确保一个类仅有一个实例&#xff0c;并提供一个全局访问点来获取该实例。下面将详细介绍饿汉式和懒汉式…

网络编程——UDP网络编程

文章目录 1、sendto()&#xff0c;recvfrom() 与TCP编程不同的是&#xff1a; 无需建立连接&#xff0c;在recvfrom()阻塞等待客户端的数据&#xff0c;收到数据后进入do something进行数据的处理。 1、sendto()&#xff0c;recvfrom() ssize_t sendto(int socket, void *mes…