Java 8 流中的延迟执行:了解 FlatMap() 和 FindFirst() 交互
在 Java 流操作中,flatMap()运算符用于将流中的每个元素转换为新流,然后将其展平为单个流。然而,当与 findFirst() 终端操作结合使用时,它表现出一种有趣的行为,引发了有关延迟执行的问题。
在提供的代码片段中,我们创建两个流:一个仅使用 filter() 和另一个同时使用 flatMap() 和 filter()。虽然第一个流立即终止执行并返回第一个元素,但第二个流尽管找到了匹配的元素,仍继续处理整个流。
为什么会出现差异?
理解这种差异的关键在于这些操作的实施方式。 findFirst() 是一个短路操作,这意味着一旦找到匹配的元素,它就可以停止执行。但是,当在 flatMap() 之后使用时,filter() 操作将对 flatMap() 生成的中间流的每个元素执行,无论是否已找到匹配项。
此行为是由于JDK-8 流实现中的限制。当使用 flatMap() 时,生成的流不是完全惰性的。相反,它急切地从源流中“拉”元素并对每个元素应用 flatMap() 转换。这意味着即使 findFirst() 找到匹配并触发取消后,已经拉入中间流的元素仍会继续由 filter() 运算符处理。
Java 10 中的解决方案和向后移植
认识到这个问题,Java 开发人员已在 Java 10 中修复它并将其向后移植到 Java 8。更新版本中,flatMap() 已变得完全惰性,允许像 filter() 这样的短路操作在找到匹配项后正确终止流执行。
含义和注意事项
虽然这个问题在 Java 的更高版本中已经得到解决,但它强调了理解流操作的延迟执行特性的重要性,特别是在结合使用 flatMap() 时短路运算符。
如果延迟执行对于您的应用程序至关重要,建议使用 Java 10 或已解决此问题的更高版本。或者,您可以在 flatMap() 转换中手动实现短路,以确保正确终止。
以上是为什么 Java 8 的 flatMap() 会阻止 findFirst() 短路?的详细内容。更多信息请关注PHP中文网其他相关文章!

在使用IntelliJIDEAUltimate版本启动Spring...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

在Idea中如何设置SpringBoot项目默认运行配置列表在使用IntelliJ...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver Mac版
视觉化网页开发工具