Java中的stream流介绍与使用

一、Stream 的基础概念

  1. 定义与特性

    • Stream 是单向数据流,对集合或数组进行高效处理,不存储数据,而是通过操作链生成新 Stream。
    • 不可变性:原始数据源不被修改,所有操作均返回新 Stream。
    • 延迟执行:中间操作(如 filter)不会立即执行,需终端操作(如 collect)触发计算。
  2. 核心优势

    • 简洁性:通过链式调用简化复杂逻辑(如 map + filter)。
    • 高效性:支持并行处理(parallelStream()),充分利用多核性能。
    • 灵活性:提供丰富的操作符(如 flatMap 处理嵌套集合)。

二、Stream 的创建方式

  1. 从集合/数组创建

    List list = Arrays.asList("Java", "Python", "C++");
    Stream listStream = list.stream();  // 集合转Stream
    Stream arrayStream = Arrays.stream(new String[]{"A", "B"});  // 数组转Stream
    
  2. 其他创建方式

    • 空 Stream:Stream.empty()(避免返回 null)。
    • 构造器:Stream.builder().add("A").build()
    • 生成器:
      Stream generated = Stream.generate(() -> "data").limit(5);  // 无限流截断
      Stream iterated = Stream.iterate(1, n -> n + 1).limit(10);  // 递增生成
      

三、Stream 的核心操作分类

1. 中间操作(Intermediate Operations)

操作作用示例代码
filter筛选元素list.stream().filter(s -> s.length() > 3) // 筛选长度>3的字符串
map转换元素类型或值.map(String::toUpperCase) // 转换为大写
sorted排序.sorted(Comparator.naturalOrder()) // 自然排序
flatMap扁平化嵌套集合List> nestedList; nestedList.stream().flatMap(List::stream)
distinct去重.distinct() // 基于 equals() 去重

2. 终端操作(Terminal Operations)

操作作用示例代码
collect收集结果为集合或对象.collect(Collectors.toList()) // 转为List
reduce归约操作(求和、拼接等)Stream.of(1,2,3).reduce(0, Integer::sum) // 结果为6
forEach遍历元素.forEach(System.out::println) // 打印所有元素
count统计元素数量.count() // 返回Long类型总数

四、实战场景与示例

  1. 数据筛选与转换

    List员工列表 = ...;
    List names = 员工列表.stream().filter(e -> e.getAge() > 30).map(E员工::getName).collect(Collectors.toList());  // 筛选年龄>30的员工姓名
    
  2. 分组统计

    Map groupedByDep = 员工列表.stream().collect(Collectors.groupingBy(E员工::getDepartment));  // 按部门分组
    
  3. 双列集合处理

    Map map = new HashMap<>();
    Stream> entryStream = map.entrySet().stream();
    

五、进阶特性与注意事项

  1. 并行流(Parallel Streams)

    • 通过 parallelStream() 启用多线程处理,适用于大数据量场景。
    • 注意线程安全问题,避免非线程安全集合(如 ArrayList)的并发修改。
  2. 基本类型专用流

    • IntStreamLongStreamDoubleStream 优化内存和性能,避免自动装箱开销:
      IntStream.range(1, 100).sum();  // 计算1-99的和
      
  3. 避免常见错误

    • 多次使用终端操作:Stream 一旦被终端操作消费,不可复用。
    • 无限流处理:需结合 limit() 截断,防止内存溢出。

六、总结

Java Stream API 通过函数式编程范式,显著提升了集合操作的简洁性和性能。合理使用 mapfiltercollect 等操作,结合并行流和基本类型流优化,可高效处理复杂数据场景。开发者需注意流的生命周期和线程安全,以充分发挥其优势。

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

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

相关文章

OCR身份证识别(正反面)_个人证照OCR识别_开放API接口使用指南

一、接口简介 在数字化时代&#xff0c;快速准确地提取身份证信息变得尤为重要。**万维易源提供的“身份证OCR识别”API接口&#xff0c;能够快速提取二代居民身份证正反面的所有字段信息&#xff0c;包括姓名、性别、民族、出生日期、住址、身份证号、签发机关、有效期限等。…

25年新版潮乎盲盒系统源码 盲盒商城系统前端分享

盲盒系统市场的前景一直都很不错&#xff0c;最近很多问我有没有盲盒源码的客户&#xff0c;下面给大家分享一个新版潮乎盲盒源码&#xff01; 这款盲盒源码系统 前端Uniapp 后端使用了Laravel框架进行开发。Laravel是一个流行的PHP框架&#xff0c;具有强大的功能和易于使用的…

Transformer四模型回归打包(内含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型)

Transformer四模型回归打包&#xff08;内含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型&#xff09; 目录 Transformer四模型回归打包&#xff08;内含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型&#xff09;预测效果基本介绍程序设计参…

Axure疑难杂症:利用中继器制作三级下拉菜单(逻辑判断进阶)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:三级下拉菜单 主要内容:条件筛选时的逻辑判断思维,中继器使用 应用场景:复合条件下的下拉列表制作 案例展…

Nginx 核心功能之正反代理

目录 一、Nginx 二、正向代理 三、反向代理 四、Nginx 缓存 1. 缓存功能的核心原理和缓存类型 2. 代理缓存功能设置 五、Nginx rewrite和正则 &#xff08;1&#xff09;Nginx 正则 &#xff08;2&#xff09;nginx location &#xff08;3&#xff09;Rewrite &…

ssh连接云服务器记录

文章目录 1. 背景2. ssh连接2.1 win 下通过终端工具进行连接2.2 Linux下通过ssh指令连接2.3 ssh使用publickey来连接 ssh连接云服务器记录 1. 背景 最近开始接触docker技术、mysql技术&#xff0c;加上本人工作基本都在Linux下进行&#xff0c;因此需要一套Linux环境进行练习。…

软考-软件设计师中级备考 12、软件工程

一、软件工程概述 定义&#xff1a;软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量软件的学科。它涉及到软件的开发、测试、维护、管理等多个方面&#xff0c;旨在运用一系列科学方法和技术手段&#xff0c;提高软件的质量和开发效率&#xff0c;降低软件开…

【多次弹出“获取打开此tobiieyetracking链接的应用”的窗口】解决办法

使用联想R9000P突然出现“获取打开此tobiieyetracking链接的应用”的窗口&#xff0c;每隔几分钟就弹一次&#xff0c;特别恶心人&#xff0c;解决办法&#xff1a; 找到【此电脑】&#xff0c;鼠标右键【管理】&#xff1b;选择【服务】&#xff0c;如下所示&#xff0c;找到…

项目选择的三个核心因素:市场前景、竞争优势和成本控制

能保持持续增长和赚钱的项目就是好项目。 每个创业者创业之初&#xff0c;遇到的第一个难题就是选择做什么项目&#xff1f; 俗话说&#xff1a;方向不对&#xff0c;努力白费。 选错项目&#xff0c;意味着你所有的付出都是打水漂。 能做的项目那么多&#xff0c;在没有价值…

裸机 Kubernetes 集群负载均衡器:MetalLB 深度解析与实战指南

一、引言 在云原生架构中&#xff0c;Kubernetes 默认的负载均衡能力依赖于云厂商&#xff08;如 AWS ELB、GCP LB&#xff09;&#xff0c;但在裸机或本地数据中心环境中&#xff0c;这一功能缺失导致 LoadBalancer 类型的 Service 始终处于 Pending 状态。此时&#xff0c;M…

2025年- H20-Lc128-240. 搜索二维矩阵 II(矩阵)---java版

1.题目描述 2.思路 遍历矩阵&#xff0c;然后如果遇到矩阵中的值正好等于target&#xff0c;输出true。否则&#xff0c;输出false。 3.代码 public class H240 {public boolean searchMatrix(int[][] matrix, int target) {//1.计算出总的行值&#xff0c;总的列值。int mm…

系统架构设计师:设计模式——行为设计模式

一、行为设计模式 行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式&#xff0c;还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的、复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。 行为类模式使用继承机制在类间分…

java springboot实现MCP Server SSE

参考&#xff1a; https://juejin.cn/post/7491881721278529570 SpringAI 实现 SSE MCP Server项目 - Auler - 博客园 springboot-MCPserver-JUnit: 使用springboot支持mcp项目搭建&#xff0c;同时有着便捷的单元测试来进行敏捷开发对话即服务&#xff1a;Spring BootMCP让…

LeetCode 热题 100 48. 旋转图像

LeetCode 热题 100 | 48. 旋转图像 大家好&#xff0c;今天我们来解决一道经典的算法题——旋转图像。这道题在LeetCode上被标记为中等难度&#xff0c;要求我们将一个 n n 的二维矩阵&#xff08;图像&#xff09;顺时针旋转90度&#xff0c;并且必须原地修改矩阵&#xff0…

嵌入式按键原理、中断过程与中断程序设计(键盘扫描程序)

按键去抖动  通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时&#xff0c;电压信号波型如下图。由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。…

数据结构之哈夫曼树

8.哈夫曼树 8.1 哈夫曼编码 哈夫曼编码&#xff08;Huffman Coding&#xff09;&#xff0c;又称霍夫曼编码&#xff0c;是一种可变字长编码&#xff08;VLC&#xff09;方式 这种编码方法完全依据字符出现的概率来构造异字头的平均长度最短的码字&#xff0c; 因此有时也被…

机器学习实操 第一部分 机器学习基础 第5章 支持向量机(SVM)

机器学习实操 第一部分 机器学习基础 第5章 支持向量机&#xff08;SVM&#xff09; 内容概要 第5章深入介绍了支持向量机&#xff08;SVM&#xff09;&#xff0c;这是一种功能强大且应用广泛的机器学习模型。SVM适用于线性或非线性分类、回归以及 novelty detection。本章详…

Webug4.0靶场通关笔记14- 第18关 文件上传之Nginx解析缺陷

目录 第18关 渗透实战 1.打开靶场 2.构造php脚本 3.源码分析 &#xff08;1&#xff09;客户端源码 &#xff08;2&#xff09;服务的源码 4.Nginx解析法渗透 &#xff08;1&#xff09;缺陷原因 &#xff08;2&#xff09;缺陷条件 &#xff08;3&#xff09;构造脚…

【QT】QT中的网络编程(TCP 和 UDP通信)

QT中的网络编程&#xff08;TCP 和 UDP通信&#xff09; 1.tcp1.1 tcp通信1.1.1 相比linux中tcp通信:1.1.2 QT中的tcp通信: 1.2 tcp通信流程1.2.1 服务器流程&#xff1a;1.2.1.1 示例代码1.2.1.2 现象 1.2.2 客户端流程&#xff1a;1.2.2.1 示例代码1.2.2.2 现象&#xff1a; …

架构思维:使用懒加载架构实现高性能读服务

文章目录 一、引言二、读服务的功能性需求三、两大基本设计原则1. 架构尽量不要分层2. 代码尽可能简单 四、实战方案&#xff1a;懒加载架构及其四大挑战五、改进思路六、总结与思考题 一、引言 在任何后台系统设计中&#xff0c;「读多写少」的业务场景占据主流&#xff1a;浏…