【Java】Stream的基本使用
Stream特点
- Stream的一系列操作组成了Stream的流水线, Stream流水线包含:
- 数据源: 这里的数据源可能是集合/数组, 可能是生成器, 甚至可能是IO通道(
Files.lines) - 零个或多个中间操作: 中间操作会导致流之间的转化, 如
filter(Predicate) - 一个终端操作: 终端操作会产生最终所需要的结果, 或是对原有的数据结构产生影响, 如
count()可以获得流中数据的长度, 而foreach(Consumer)可以对流中所有的数据依次操作
- 数据源: 这里的数据源可能是集合/数组, 可能是生成器, 甚至可能是IO通道(
- Stream流是java中函数编程的一个典型代表, 它具有函数式编程的所有优点, 主要包括:
- 延迟计算: 在终端操作前, 所有的操作都不会被真正执行, 只有真正需要计算内容才会被执行, 提高了性能
- 代码简洁: 函数式编程的api调用代码简洁且意图明确, 其可读性远高于for循环
- 底层优化: 底层优化师延迟计算所附带的一个优势, 在执行终端操作前, 底层可以优化执行顺序及执行过程, 以达到最高的执行效率
- 多核封装: Stream流的单核操作和多核操作共享一套接口, 使多核编程非常易用
- Stream的使用与Collection的使用非常相似, 但Stream与Collection有本质上的不同:
- 无存储性: Stream流不存储任何数据, 它只是数据的一个视图
- 不可变性: 对Stream的操作不会修改其背后的数据源, 而是产生一个新的Stream 实际上为了方便, 有部分的api会对原数据修改
- 惰性执行: Collection中的数据消费的结果可以立即体现, 而Stream真正需要执行的时候才会执行
- 单次消费: Stream中的数据仅能被消费一次, 一次遍历后就会失效, 若要二次消费则需重新生成Stream
Stream的实现
常用的Stream接口继承关系如下图:

如上图, Stream接口继承于BaseStream; 主要可以分为针对基本类型的LongStream/IntStream/DoubleStream和针对Object实现的通用的Stream接口; 这样既保证了面向对象的操作, 也保证了对基本类型的兼容
Stream的基本使用
中间操作
filter
filter用于根据predicate中定义的方法来过滤集合中的元素, 如下面的例子integer -> integer > 3就过滤掉了小于或等于3的元素
public void filter() {Arrays.asList(1, 2, 3, 4, 5, 6, 7).stream().filter(integer -> integer > 3).forEach(System.out::println);
}
map
map的功能是对Stream中的元素进行转换, 转换规则为传入的mapper函数; 转换过程不会改变元素的数量, 只会改变元素的类型和值; 下面的例子中, 将所有字符都包裹上了尖括号
public void map() {Arrays.stream("It's a wonderful day for me".split(" ")).map(s -> "<" + s + ">").forEach(System.out::println);}
flatMap
flatMap类似于map; 但是他会将mapper返回的的流"摊平"(flatten); 此过程不同于map, 它会改变元素的数量, 同时也会改变元素的类型和值; 下面的例子会将原列表中所有的数字列表摊平, 并形成一个新的流, 即一个包含1-7所有数字的流
public void flatMap() {Arrays.asList(Collections.singleton(1), Arrays.asList(2, 3, 4), Set.of(5,6,7)).stream().flatMap(Collection::stream).forEach(System.out::println);
}
终端操作
forEach
forEach是对容器中的每个元素执行传入的Consumer的操作; 如下面的例子, 传入的是System.out::println, 因此会打印每个元素
public void foreach() {Arrays.asList(1, 2, 3, 4, 5, 6, 7).stream().forEach(System.out::println);}
sorted
sorted函数有两个, 一个是按照自然顺序排序, 另一个是使用自定义比较器排序, 对应的是Comparator.naturalOrder()其底层会调用Comparable.compareTo; 下面的例子对字符串的长度记性升序排序
public void sorted() {Arrays.stream("It's a wonderful day for me".split(" ")).sorted((s1, s2) -> s1.length() - s2.length()).forEach(System.out::println);}
reduce
reduce操作可以从一组元素中规约生成一个值, 它可以实现多种操作, 在java流中max, min, sum, count的本质都是规约操作; 下面是规约操作的定义, 它通过一个初始值identity进行累加, 最后生成一个值, 在并发并发情况下, 还可能会需要对多个累加的值进行合并
<U> U reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner);
max
下面是对reduce的一个最基本的使用, 找到长度最大的字符串的值; 它从第一个元素开始累计, 每次对比两个元素并取较大的元素; 如此进行累加, 最后得到的便是最大的元素
System.out.println(Stream.of("I", "love", "you", "too").reduce((s1, s2) -> s1.length() >= s2.length() ? s1 : s2).orElse(null));System.out.println(Stream.of("I", "love", "you", "too").max((s1, s2) -> s1.length() - s2.length()).orElse(null));
sum
max无需指定幺元identity和combiner因为它是从第一个元素开始累加的; 其会从第一个元素开始累积, 并且会调用acuumulator进行combine; 而sum方法需要自己指定初始值为0, 并指定combiner的逻辑为两个分段的相加, 如下面的例子计算流中的字符数
public void totalLength() {System.out.println(Stream.of("I", "love", "you", "too").reduce(0, (total, s) -> total + s.length(), (a, b) -> a + b));
}
相关文章:
【Java】Stream的基本使用
Stream特点 Stream的一系列操作组成了Stream的流水线, Stream流水线包含: 数据源: 这里的数据源可能是集合/数组, 可能是生成器, 甚至可能是IO通道(Files.lines)零个或多个中间操作: 中间操作会导致流之间的转化, 如filter(Predicate)一个终端操作: 终端操作会产生最终所需要的…...
idea Springboot 高校科研资源共享系统VS开发mysql数据库web结构java编程计算机网页源码maven项目
一、源码特点 springboot 高校科研资源共享系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发), 系统具有完整的源代码和数据…...
机器学习算法基础--K-means应用实战--图像分割
目录 1.项目内容介绍 2.项目关键代码 3.项目效果展示 1.项目内容介绍 本项目是将一张图片进行k-means分类,根据色彩k进行分类,最后比较和原图的效果。 题目还是比较简单的,我们只要通过k-means聚类,一类就是一种色彩得出聚类之…...
CSS学习小结
css的两种使用方式: ①内嵌样式表 ②导入外部样式表(实际开发常用)<link href"...." rel"stylesheet"/> 选择器: ①标签选择器:通过标签种类决定 ②类选择器:class"..…...
数据挖掘实验(一)数据规范化【最小-最大规范化、零-均值规范化、小数定标规范化】
一、数据规范化的原理 数据规范化处理是数据挖掘的一项基础工作。不同的属性变量往往具有不同的取值范围,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间由于取值范围带来的差异,需要进行标准化处理。将数据…...
C++17中std::filesystem::directory_entry的使用
C17引入了std::filesystem库(文件系统库, filesystem library)。这里整理下std::filesystem::directory_entry的使用。 std::filesystem::directory_entry,目录项,获取文件属性。此directory_entry类主要用法包括: (1).构造函数、…...
C/C++跨平台构建工具CMake入门
文章目录 1.概述2.环境准备2.1 安装编译工具2.2 安装CMake 3.编译一个示例程序总结 1.概述 本人一直对OpenGL的3d渲染很感兴趣,但是苦于自己一直是Android开发,没有机会接触这方面的知识。就在最近吗,机会来了,以前一个做3D渲染的…...
【CFD小工坊】浅水方程的离散及求解方法
【CFD小工坊】浅水方程的离散及求解方法 前言基于有限体积法的方程离散界面通量与源项计算干-湿网格的处理数值离散的稳定性条件参考文献 前言 我们模型的控制方程,即浅水方程组的表达式如下: ∂ U ∂ t ∂ E ( U ) ∂ x ∂ G ( U ) ∂ y S ( U ) U…...
第十四章 类和对象——C++对象模型和this指针
一、成员变量和成员函数分开存储 在C中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 class Person {public:Person() {mA 0;}//非静态成员变量占对象空间int mA;//静态成员变量不占对象空间static int mB; //函数也不占对象空间&#…...
计算机竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测
文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐…...
java web+Mysql e-life智能生活小区物业管理系统
本项目为本人自己书写,主要服务小区业主和管理人员。 e-life智能生活小区涉及多个方面的智能化和便利化服务: 1. 用户模块:包含基本的登入登出操作,查看个人信息中用户可以查看 自己的个人资料但不可以修改个人信息。 a) 用户…...
AttributeError: module ‘dgl‘ has no attribute ‘batch_hetero‘
DGLWarning: From v0.5, DGLHeteroGraph is merged into DGLGraph. You can safely replace dgl.batch_hetero with dgl.batch...
Vue项目搭建图文详解教程
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 预备工作 请在本地创建文件夹用于存放Vue项目,例如:创建HelloWorld文件夹存放即将创建的Vue新项目。 创建Vue项目 首先,请在DOS中将目录…...
SpringMVC处理请求核心流程
一、前言 SpringMVC是一个基于Java的Web框架,它使用MVC(Model-View-Controller)设计模式来处理Web请求。在SpringMVC中,请求处理的核心流程主要包括以下几个步骤: 1、用户发送请求到前端控制器(Dispatche…...
SoloX:Android和iOS性能数据的实时采集工具
SoloX:Android和iOS性能数据的实时采集工具 github地址:https://github.com/smart-test-ti/SoloX 最新版本:V2.7.6 一、SoloX简介 SoloX是开源的Android/iOS性能数据的实时采集工具,目前主要功能特点: 无需ROOT/越狱…...
【知识点随笔分析 | 第五篇】简单介绍什么是QUIC
前言: 随着互联网的快速发展,传统的基于TCP的协议开始显现出一些局限性。TCP在连接建立和拥塞控制方面存在一定的延迟,这可能导致用户在访问网页、观看视频或玩网络游戏时感受到不必要的等待时间。而QUIC作为一种新兴的传输协议,试…...
vscode ssh 远程免密登录开发
存放代码的机器运行 sshd, vscode 所在机器保证可以通过 ssh 登录服务器vscode 机器通过 ssh-keygen 生成 ssh 公私钥对(已有可以忽略)将客户端的 id_rsa.pub 加入到服务器的鉴权队列 cat id_rsa.pub >> authorized_keysvscode 配置ssh登录即可.ctrlp, remote-ssh: open …...
辅助驾驶功能开发-测试篇(2)-真值系统介绍
1 真值系统概述 1.1 真值评测系统核心应用 快速构建有效感知真值,快速完成感知性能评估,快速分析感知性能缺陷。 主要应用场景包括: 1. 感知算法开发验证: 在算法开发周期中,评测结果可以作为测试报告的一部分,体现算法性能的提升。 2. 遴选供应…...
运行程序时msvcr110.dll丢失的解决方法,msvcr110.dll丢失5的个详细解决方法
在使用电脑的过程中,我们经常会遇到各种问题,其中之一就是 msvcr110.dll 丢失的问题。msvcr110.dll 是 Microsoft Visual C Redistributable 的一个组件,用于支持使用 Visual C 编写的应用程序。如果您的系统中丢失了这个文件,您可…...
已解决 Bug——IndexError: index 3 is out of bounds for axis 0 with size 3问题
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂🦖…...
Reset Windows Update Tool:开源工具解决Windows更新问题的3个高效方案
Reset Windows Update Tool:开源工具解决Windows更新问题的3个高效方案 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...
Python爬虫实战:手把手教你如何基于 Python 异步架构的 Crates.io 工业级爬虫实战!
㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐☆☆☆(基础级) 🉐福利: 一次订阅…...
SwiftHub:终极GitHub iOS客户端开发指南 - RxSwift与MVVM-C架构实践
SwiftHub:终极GitHub iOS客户端开发指南 - RxSwift与MVVM-C架构实践 【免费下载链接】SwiftHub GitHub iOS client in RxSwift and MVVM-C clean architecture 项目地址: https://gitcode.com/gh_mirrors/sw/SwiftHub SwiftHub是一款功能强大的GitHub iOS客户…...
WhisperX语音识别:如何实现70倍实时转录精度与词级时间戳?
WhisperX语音识别:如何实现70倍实时转录精度与词级时间戳? 【免费下载链接】whisperX m-bain/whisperX: 是一个用于实现语音识别和语音合成的 JavaScript 库。适合在需要进行语音识别和语音合成的网页中使用。特点是提供了一种简单、易用的 APIÿ…...
鲁棒估计与5点算法求解本质矩阵
发散,无法保证找到全局正确的解。鉴于5点算法的代数复杂性和实现难度(涉及高次多项式求根、病态方程处理等),并且考虑到本系列文章的核心主题是数值优化而非代数几何,我们在此不展开其繁琐的数学推导和代码实现细节。感…...
深入解析原生HTTP与MCP服务器的交互机制
1. 原生HTTP与MCP服务器交互的核心机制 当你第一次听说MCP服务器时,可能会觉得这是个高大上的概念。其实简单来说,MCP(Model Context Protocol)就是一种让客户端和AI模型服务端进行高效通信的协议。而HTTP作为互联网最基础的通信协…...
如何实现百度网盘下载加速?KinhDown让大文件传输效率倍增
如何实现百度网盘下载加速?KinhDown让大文件传输效率倍增 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 还在忍受百度网盘的龟速下载吗?当你急需工作文件却被限制在几十KB/s的速度时,当重…...
FRCRN开源模型部署指南:国产昇腾Ascend 910B适配与性能实测
FRCRN开源模型部署指南:国产昇腾Ascend 910B适配与性能实测 1. 项目概述与背景 FRCRN(Frequency-Recurrent Convolutional Recurrent Network)是阿里巴巴达摩院在ModelScope社区开源的单通道语音降噪模型,专门针对16kHz采样率的…...
英飞凌TC377芯片选型指南:从300MHz三核到FlexRay,汽车电子工程师如何快速上手?
英飞凌TC377芯片选型实战:汽车电子工程师的黄金法则 当汽车电子工程师面对英飞凌TC377这颗"三核300MHz怪兽"时,数据手册上密密麻麻的参数表格往往让人无从下手。我曾参与过某新能源车企的域控制器开发,团队花了整整两周时间争论芯片…...
从百兆到千兆:RJ45网口背后的技术演进与协议优化全解析
从百兆到千兆:RJ45网口背后的技术演进与协议优化全解析 当你拿起一根普通的网线连接电脑时,可能不会想到这根看似简单的线缆背后隐藏着怎样的技术革命。从最初的10Mbps到如今的千兆以太网,RJ45接口承载了网络通信技术的巨大飞跃。本文将带你深…...
