【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✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂🦖…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...