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: 几个案例-掌握贪心算法
什么是贪心算法 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。它不从整体最优上加以考虑,只做出在某种意义上的局部最优解。下面我们将通过几个案例…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...