java基础教学 |Java Stream API详解
Java Stream API 是Java 8引入的一个重要特性,它为集合对象提供了一种新的计算模型,使得开发者能够以声明性的方式处理数据集合。Stream API 不仅提高了代码的可读性和简洁性,还极大地优化了并行处理能力,让复杂的集合操作变得高效且易于实现。本文将深入探讨Java Stream的工作原理、核心概念、常用操作、并行处理以及一些最佳实践,帮助开发者充分理解和掌握这一强大工具。
1. Stream 的基本概念
Stream(流)是一个来自数据源的元素序列,支持聚合操作。与集合不同,Stream 自身并不存储数据,而是按需计算。数据源可以是数组、集合、I/O通道、生成器函数等。Stream API 的设计遵循函数式编程原则,操作分为中间操作(Intermediate Operations)和终端操作(Terminal Operations)。
- 中间操作:如
filter,map等,它们会返回一个新的流,允许进行链式调用,且这些操作是延迟执行的。 - 终端操作:如
forEach,collect,reduce等,它们会消费流,产生一个结果或副作用,并且执行后流不能再被使用。
2. 创建Stream
Java 中可以通过多种方式创建Stream:
- 从集合创建:如
List<String> names = ...; Stream<String> nameStream = names.stream(); - 从数组创建:如
String[] array = ...; Stream<String> stream = Arrays.stream(array); - 静态工厂方法:如
Stream.of("a", "b", "c"),IntStream.range(0, 10)等。 - 文件IO:如
Files.lines(Paths.get("path/to/file.txt"))。
3. 常用的Stream操作
过滤(Filter)
filter(Predicate) 方法用于过滤出满足条件的元素。
List<String> filtered = names.stream().filter(name -> name.startsWith("A")).collect(Collectors.toList());
映射(Map)
map(Function) 方法用于对流中的每个元素应用函数进行转换。
List<Integer> lengths = names.stream().map(String::length).collect(Collectors.toList());
排序(Sort)
sorted() 或 sorted(Comparator) 方法对流中的元素进行排序。
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
并发映射(Parallel Streams)
Java 8 引入了并行流,通过 parallelStream() 方法获得,它能自动利用多核处理器的优势。
List<String> upperCaseNames = names.parallelStream().map(String::toUpperCase).collect(Collectors.toList());
4. 终端操作
收集(Collect)
collect(Collector) 是一个强大的终端操作,常用于将流转换为集合或其他形式的结果。
List<String> distinctNames = names.stream().distinct().collect(Collectors.toList());
归约(Reduce)
reduce 方法用于将流中的元素通过某种操作“规约”为一个值。
OptionalInt sum = numbers.stream().mapToInt(Integer::intValue).reduce(Integer::sum);
查找(Find)
findFirst() 返回流中第一个元素的Optional;anyMatch(Predicate) 检查是否至少有一个元素满足条件。
5. 并行处理的最佳实践
- 选择合适的数据结构:并行处理前,确保数据结构支持高效的并发访问。
- 避免副作用:在并行流中应避免使用有副作用的操作,因为这可能导致不可预测的结果或竞态条件。
- 考虑性能成本:对于小数据集,串行流可能更快,因为并行化的开销可能超过其带来的好处。
- 利用并行度调整:可以通过
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "N")调整默认的并行级别。
6. 性能调优与监控
- 监控内存使用:大量数据流处理时,注意内存溢出风险,适时使用短路操作如
anyMatch,findFirst。 - 利用JVM工具:使用VisualVM、JConsole等工具监控CPU、内存使用情况,优化程序性能。
- 并行流调试:利用
ForkJoinPool的日志记录功能,分析并行流的执行情况。
结论
Java Stream API 是现代Java开发不可或缺的一部分,它不仅简化了集合操作,还极大地提升了处理大数据集合的效率。通过熟练掌握Stream的创建、操作以及并行处理技巧,开发者能够编写出更简洁、高效、可维护的代码。随着技术的发展,不断探索Stream API的新特性和最佳实践,对于提升软件质量和开发效率具有重要意义。
相关文章:
java基础教学 |Java Stream API详解
Java Stream API 是Java 8引入的一个重要特性,它为集合对象提供了一种新的计算模型,使得开发者能够以声明性的方式处理数据集合。Stream API 不仅提高了代码的可读性和简洁性,还极大地优化了并行处理能力,让复杂的集合操作变得高效…...
0.0和0.00竟然不相等!!!BigDecimal别用错了比较方式
对于BigDecimal字段,可以使用compareTo()方法和equals()方法进行比较。但是要注意这两种方法的作用有所不同。一般都应该使用BigDecimal比较值,而不是使用经常用到的equals方法比较内容。 1.compareTo()方法 是用来比较两个BigDecimal对象的大小关系。…...
【多模态】30、Monkey | 支持大尺寸图像输入的多任务多模态大模型
文章目录 一、背景二、方法2.1 Enhancing Input Resolution2.2 Multi-level Description Generation2.3 Multi-task Training 三、效果3.1 Image Caption3.2 General VQA3.3 Scene Text-centric VQA3.4 Document-oriented VQA3.5 消融实验3.6 可视化 论文:Monkey : …...
PHP黑魔法之md5绕过
php本身是一种弱语言,这个特性决定了它的两个特点: 输入的参数都是当作字符串处理变量类型不需要声明,大部分时候都是通过函数进行类型转化php中的判断有两种: 松散比较:只需要值相同即可,类型不必相同,不通类型比较会先转化为同类型,比如全数字字符串和数字比较,会比…...
【适用全主题】WordPress原创插件:弹窗通知插件 支持内容自定义
内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 适用于所有WordPress主题的弹窗插件 一款WordPress原创插件:弹窗通知插件 支持内容自定义 二、效果展示 1.部分代码 代码如下(示例)࿱…...
定时器的理论和使用
文章目录 一、定时器理论1.1定时器创建和使用 二、定时器实践2.1周期触发定时器2.2按键消抖 一、定时器理论 定时器是一种允许在特定时间间隔后或在将来的某个时间点调用回调函数的机制。对于需要周期性任务或延迟执行任务的嵌入式应用程序特别有用。 软件定时器: …...
【架构-17】通信系统架构设计理论
通信系统网络架构 1. 局域网网络架构 拓扑结构:星型、总线型、环型、树型。 网络架构:单核心架构(结构简单,地理范围受限)、双核心架构(网络拓扑结构可靠,投资较单核高)、环型架构…...
网络中的基本概念
网络初识 局域网:把若干个电脑组成在一起,通过路由器进行组网。 广域网:把局域网进一步的连接,构成更复杂的网络体系。 IP地址:区分主机。 端口号:区分主机上不同的程序。 协议:是一种约定&…...
手撸XXL-JOB(二)——定时任务管理
在上一节中,我们介绍了SpringBoot中关于定时任务的执行方式,以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台,那么,对于任务的管理,是尤为重要的。接下来我们…...
DEV--C++小游戏(吃星星(0.2))
目录 吃星星(0.2) 简介 本次更新 分部代码 头文件(增) 命名空间变量(增) 副函数(新,增) 清屏函数 打印地图函数(增) 移动函数 选择颜色…...
Lua 协程池
协程池 在 使用 Lua 协程模拟 Golang 的 go defer 编程模式 中介绍了 Lua 协程的使用,模仿 golang 封装了下 还可以做进一步的优化 原来的 go 函数是这样实现的: function go(_co_task)local co coroutine.create(function(_co_wrap)_co_task(_co_w…...
[Linux][网络][协议技术][DNS][ICMP][ping][traceroute][NAT]详细讲解
目录 1.DNS1.DNS背景2.域名简介 2.ICMP协议1.ICMP功能2.ICMP两类报文 3.ping命令4.traceroute5.NAT技术1.NAT技术背景2.NAT IP转换过程3.静态地址NAT && 动态地址NAT4.网络地址端口转换NAPT5.NAT技术的缺陷6.NAT和代理服务器 6.总结1.数据链路层2.网络层3.传输层4.应用…...
Android 集成Bugly完成线上的异常Exception收集及处理
文章目录 (一)添加产品APP(二)集成SDK(三)参数配置权限混淆 (四)初始化 (一)添加产品APP 一)在个人头像 -> 我的头像 -> 新建产品 二&…...
Redis——Redis的数据库结构、删除策略及淘汰策略
Redis是一个高性能的key-value存储系统,它支持多种数据结构,并提供了丰富的删除策略和淘汰策略。以下是关于Redis的数据库结构、删除策略及淘汰策略的详细介绍: Redis的数据库结构 Redis是一个key-value数据库,数据存储是以一个…...
【Vue3笔记03】Vue3项目工程中使用vue-router路由
这篇文章,主要介绍Vue3项目工程中如何使用vue-router路由。 目录 一、vue-router路由 1.1、下载vue-router路由 1.2、创建router.js文件 1.3、main.js配置路由...
并行执行的4种类别——《OceanBase 并行执行》系列 4
OceanBase 支持多种类型语句的并行执行。在本篇博客中,我们将根据并行执行的不同类别,分别详细阐述:并行查询、并行数据操作语言(DML)、并行数据定义语言(DDL)以及并行 LOAD DATA 。 《并行执行…...
函数练习.
1.打印乘法口诀表 口诀表的行数和列数自己指定如:输入9,输出99口诀表,输出12,输出1212的乘法口诀表。 multiplication(int index) { if (index 9) { int i 0; for (i 1; i < 10; i) { int j 0; for (j 1; j &…...
Git 分支命令操作详解
目录 1、分支的特点 2、分支常用操作 3、分支的使用 3.1、查看分支 3.2、创建分支 3.3、修改分支 3.4、切换分支 3.5、合并分支 3.6、产生冲突 3.7、解决冲突 3.8、创建分支和切换分支说明 1、分支的特点 同时并行推进多个功能开发,提高开发效率。各个分…...
十二生肖Midjourney绘画大挑战:释放你的创意火花
随着AI艺术逐渐进入大众视野,使用Midjourney绘制十二生肖不仅能够激发我们的想象力,还能让我们与传统文化进行一场新式的对话。在这里,我们会逐一提供给你创意满满的绘画提示词,让你的作品别具一格。而且,我们还精选了…...
【C++】priority_queues(优先级队列)和反向迭代器适配器的实现
目录 一、 priority_queue1.priority_queue的介绍2.priority_queue的使用2.1、接口使用说明2.2、优先级队列的使用样例 3.priority_queue的底层实现3.1、库里面关于priority_queue的定义3.2、仿函数1.什么是仿函数?2.仿函数样例 3.3、实现优先级队列1. 1.0版本的实现…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
