Java中Stream流的详细使用介绍
Java中Stream流的详细使用介绍
- **1. 创建 Stream**
- 从集合创建
- 从数组创建
- 使用 `Stream.of` 创建
- 创建无限流
- **2. 中间操作**
- 过滤:`filter`
- 映射:`map`
- 去重:`distinct`
- 排序:`sorted`
- 截取:`limit` 和 `skip`
- **3. 终端操作**
- 收集:`collect`
- 遍历:`forEach`
- 匹配:`anyMatch`、`allMatch`、`noneMatch`
- 计数:`count`
- 聚合:`reduce`
- **4. 并行流**
- **5. 常用工具类:`Collectors`**
- 转换为列表:`toList`
- 转换为集合:`toSet`
- 转换为映射:`toMap`
- 连接字符串:`joining`
- **6. 示例代码**
- **总结**
在 JDK 8 中,
Stream
是 Java 集合操作的一个强大工具,它允许以声明式的方式处理数据集合(如过滤、映射、排序、聚合等)。
Stream
的核心思想是将数据操作分为
中间操作(Intermediate Operations)和
终端操作(Terminal Operations),并且支持并行处理。
1. 创建 Stream
可以通过多种方式创建 Stream
:
从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
从数组创建
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
使用 Stream.of
创建
Stream<String> stream = Stream.of("a", "b", "c");
创建无限流
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1); // 从 0 开始,每次加 1
Stream<Double> randomStream = Stream.generate(Math::random); // 生成随机数流
2. 中间操作
中间操作返回一个新的 Stream
,可以链式调用。
过滤:filter
List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> result = list.stream().filter(s -> s.startsWith("a")) // 过滤以 "a" 开头的字符串.collect(Collectors.toList());
// 结果:["apple"]
映射:map
List<String> list = Arrays.asList("apple", "banana", "cherry");
List<Integer> result = list.stream().map(String::length) // 将字符串映射为其长度.collect(Collectors.toList());
// 结果:[5, 6, 6]
去重:distinct
List<String> list = Arrays.asList("apple", "banana", "apple");
List<String> result = list.stream().distinct() // 去重.collect(Collectors.toList());
// 结果:["apple", "banana"]
排序:sorted
List<String> list = Arrays.asList("banana", "apple", "cherry");
List<String> result = list.stream().sorted() // 自然排序.collect(Collectors.toList());
// 结果:["apple", "banana", "cherry"]
截取:limit
和 skip
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().skip(2) // 跳过前 2 个元素.limit(2) // 只取 2 个元素.collect(Collectors.toList());
// 结果:[3, 4]
3. 终端操作
终端操作会触发流的处理,并返回一个非流的结果。
收集:collect
List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> result = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
// 结果:["apple"]
遍历:forEach
List<String> list = Arrays.asList("apple", "banana", "cherry");
list.stream().forEach(System.out::println);
// 输出:
// apple
// banana
// cherry
匹配:anyMatch
、allMatch
、noneMatch
List<String> list = Arrays.asList("apple", "banana", "cherry");
boolean anyStartsWithA = list.stream().anyMatch(s -> s.startsWith("a")); // 是否有以 "a" 开头的
boolean allStartsWithA = list.stream().allMatch(s -> s.startsWith("a")); // 是否全部以 "a" 开头
boolean noneStartsWithZ = list.stream().noneMatch(s -> s.startsWith("z")); // 是否没有以 "z" 开头的
计数:count
List<String> list = Arrays.asList("apple", "banana", "cherry");
long count = list.stream().filter(s -> s.startsWith("a")).count();
// 结果:1
聚合:reduce
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, Integer::sum); // 求和
// 结果:15
4. 并行流
通过 parallelStream()
或 stream().parallel()
可以将流转换为并行流,利用多核处理器加速处理。
List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> result = list.parallelStream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
// 结果:["apple"]
5. 常用工具类:Collectors
Collectors
提供了丰富的工具方法,用于将流转换为集合或其他数据结构。
转换为列表:toList
List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> result = list.stream().collect(Collectors.toList());
转换为集合:toSet
Set<String> set = list.stream().collect(Collectors.toSet());
转换为映射:toMap
Map<String, Integer> map = list.stream().collect(Collectors.toMap(s -> s, String::length));
// 结果:{"apple": 5, "banana": 6, "cherry": 6}
连接字符串:joining
String joined = list.stream().collect(Collectors.joining(", "));
// 结果:"apple, banana, cherry"
6. 示例代码
以下是一个完整的示例,展示 Stream
的常见用法:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry", "date");// 过滤、映射、排序、收集List<String> result = list.stream().filter(s -> s.length() > 4) // 过滤长度大于 4 的字符串.map(String::toUpperCase) // 转换为大写.sorted() // 排序.collect(Collectors.toList()); // 收集为列表System.out.println(result); // 输出:[APPLE, BANANA, CHERRY]}
}
总结
Stream
提供了一种高效、简洁的方式来处理集合数据。- 中间操作(如
filter
、map
)是惰性的,只有在终端操作(如collect
、forEach
)调用时才会执行。 - 并行流可以充分利用多核 CPU 的性能。
相关文章:
Java中Stream流的详细使用介绍
Java中Stream流的详细使用介绍 **1. 创建 Stream**从集合创建从数组创建使用 Stream.of 创建创建无限流 **2. 中间操作**过滤:filter映射:map去重:distinct排序:sorted截取:limit 和 skip **3. 终端操作**收集…...

【重构小程序】升级JDK1.8、SpringBoot2.x 到JDK17、Springboot 3.x(一)
前言 最近想着把大火的deepseek 迁移到小程序里,基于刷题小程序的数据库做一个RAG应用,来进一步扩展答案解析,帮助用户解答相关问题。但是由于之前做的项目都要老了,并不支持spring 的AI模块,因此,我打算先…...

功能丰富的自动化任务软件zTasker_2.1.0_绿色版_屏蔽强制更新闪退
🚀 zTasker 一键式效率倍增器使用指南 🙏 致谢 首先感谢开发者提供如此高效的工具! 软件本身功能强大,但部分机制需特别注意! 📖 软件概述 zTasker 是一款通过自动化脚本/任务流实现效率飞跃的生产力工…...
_ 为什么在python中可以当变量名
在 Python 中,_(下划线)是一个有效的变量名,这主要源于 Python 的命名规则和一些特殊的使用场景。以下是为什么 _ 可以作为变量名的原因和常见用途: --- ### 1. **Python 的命名规则** Python 允许使用字母ÿ…...

Java 9 到 Java 21 新特性全解析:从语法简化到API增强
一、新特性的概述 纵观Java这几年的版本变化,在Java被收入Oracle之后,Java以小步快跑的迭代方式,在功能更新上迈出了更加轻快的步伐。基于时间发布的版本,可以让Java研发团队及时获得开发人员的反馈,因此可以看到最近…...

LeeCode题库第三十九题
39.组合总和 项目场景: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同…...

卫星网络仿真平台:IPLOOK赋能空天地一体化通信新生态
卫星仿真平台 在6G技术加速演进与天地一体化网络建设的大背景下,卫星通信作为地面网络的重要补充,正成为全球通信覆盖的关键支撑。IPLOOK凭借其深厚的技术积累与创新实践,推出的卫星网络仿真平台(SCEPS),…...

(十一)基于vue3+mapbox-GL实现模拟高德实时导航轨迹播放
要在 Vue 3 项目中结合 Mapbox GL 实现类似高德地图的实时导航轨迹功能,您可以按照以下步骤进行: 安装依赖: 首先,安装 mapbox-gl 和 @turf/turf 这两个必要的库: npm install mapbox-gl @turf/turf引入 Mapbox GL: 在组件中引入 mapbox-gl 并初始化地图实例: <templ…...
计算机面试项目经历描述技巧
在计算机类岗位的面试中,项目经历是面试官评估候选人技术能力、问题解决能力和实战经验的核心环节。以下是专业化的项目经历描述策略(附模板框架): 一、结构化表达框架(STAR-RT模型) Situation(…...

132. 分割回文串 II
简单分析 输入的参数是字符串s,返回值是最小的切割次数。那这个问题的典型解法应该是动态规划,因为我们需要找最优解,而每一步的选择可能会影响后面的结果,但可以通过子问题的最优解来构建整体最优解。 那么动态规划的状态如何定…...
【每日学点HarmonyOS Next知识】全局调整字体、h5选择框无法取消选中、margin不生效、Length转换为具体值、Prop和link比较
【每日学点HarmnoyOS Next知识】全局调整字体、h5选择框无法取消选中、margin不生效、Length转换为具体值、Prop和link比较 1、HarmonyOS 是否存在统一调整全局字体大小的方法? 是否存在统一调整全局字体大小的方法 可以用动态属性,自定义class实现At…...
九、Spring Boot:自动配置原理
深入解析 Spring Boot 自动配置原理 Spring Boot 的自动配置机制是其最核心的特性之一,它极大地简化了 Spring 应用的初始搭建和开发过程。通过自动配置,Spring Boot 能够根据项目的依赖和配置自动加载和配置 Spring 应用的各个部分。本文将深入探讨 Sp…...

(动态规划 最长重复子数组)leetcode 718
思路就是建立一个二维的dp数组,只要nums1[i]nums2[j](nums1和nums2出现重复元素就置1 并加上左上角的值) 为什么代码是nums1 i-1和nums2 i-1 答:因为i和j以1为初始值开始遍历的 为什么要这么做并且为什么要加dp【i-1】【j-1】? …...
SFP+(Enhanced Small Form-factor Pluggable)详解
1. SFP的定义 SFP(Small Form-factor Pluggable Plus)是SFP的增强版本,专为10Gbps及以上高速网络设计。它继承了SFP的小型化、热插拔特性,但通过优化电气接口和协议支持,实现了更高的传输速率(典型为10Gbp…...

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型音乐推荐系统 音乐数据分析 音乐可视化 音乐爬虫 知识图谱 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Deepseek对ChatGPT的冲击?
从测试工程师的视角来看,DeepSeek对ChatGPT的冲击主要体现在**测试场景的垂直化需求与通用模型局限性之间的博弈**。以下从技术适配性、效率优化、风险控制及未来趋势四个维度展开分析: --- ### **一、技术适配性:垂直领域能力决定工具选择…...

【Python 初级函数详解】—— 参数沙漠与作用域丛林的求生指南
欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创…...

极客大学 java 进阶训练营怎么样,图文详解
Spring 思维导图 Spring 源码学习笔记 有关微服务的面试题: Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?微服务学习笔记 有关分布式的面试题: 消息幂等:如何保证消息不被重复…...

机器人学习模拟框架 robosuite (3) 机器人控制代码示例
Robosuite框架是一个用于机器人模拟和控制的强大工具,支持多种类型的机器人。 官方文档:Overview — robosuite 1.5 documentation 开源地址:https://github.com/ARISE-Initiative/robosuite 目录 1、通过键盘或SpaceMouse远程控制机器人…...
玩转python: 几个案例-掌握贪心算法
什么是贪心算法 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。它不从整体最优上加以考虑,只做出在某种意义上的局部最优解。下面我们将通过几个案例…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...