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中文网其他相关文章!

Javaremainsagoodlanguageduetoitscontinuousevolutionandrobustecosystem.1)Lambdaexpressionsenhancecodereadabilityandenablefunctionalprogramming.2)Streamsallowforefficientdataprocessing,particularlywithlargedatasets.3)ThemodularsystemintroducedinJava9im

Javaisgreatduetoitsplatformindependence,robustOOPsupport,extensivelibraries,andstrongcommunity.1)PlatformindependenceviaJVMallowscodetorunonvariousplatforms.2)OOPfeatureslikeencapsulation,inheritance,andpolymorphismenablemodularandscalablecode.3)Rich

Java的五大特色是多态性、Lambda表达式、StreamsAPI、泛型和异常处理。1.多态性让不同类的对象可以作为共同基类的对象使用。2.Lambda表达式使代码更简洁,特别适合处理集合和流。3.StreamsAPI高效处理大数据集,支持声明式操作。4.泛型提供类型安全和重用性,编译时捕获类型错误。5.异常处理帮助优雅处理错误,编写可靠软件。

java'stopfeatureSnificallyEnhanceItsperFormanCeanDscalability.1)对象 - 方向 - incipleslike-polymormormormormormormormormormormormormorableablefleandibleandscalablecode.2)garbageCollectionAutoctionAutoctionAutoctionAutoctionAutoctionautomorymanatesmemorymanateMmanateMmanateMmanagementButCancausElatenceiss.3)

JVM的核心组件包括ClassLoader、RuntimeDataArea和ExecutionEngine。1)ClassLoader负责加载、链接和初始化类和接口。2)RuntimeDataArea包含MethodArea、Heap、Stack、PCRegister和NativeMethodStacks。3)ExecutionEngine由Interpreter、JITCompiler和GarbageCollector组成,负责bytecode的执行和优化。

Java'ssafetyandsecurityarebolsteredby:1)strongtyping,whichpreventstype-relatederrors;2)automaticmemorymanagementviagarbagecollection,reducingmemory-relatedvulnerabilities;3)sandboxing,isolatingcodefromthesystem;and4)robustexceptionhandling,ensuringgr

javaoffersseveralkeyfeaturesthatenhancecodingskills:1)对象 - 方向 - 方向上的贝利奥洛夫夫人 - 启动worldentities

thejvmisacrucialcomponentthatrunsjavacodebytranslatingitolachine特定建筑,影响性能,安全性和便携性。1)theclassloaderloader,links andinitializesClasses.2)executionEccutionEngineExecutionEngineExecutionEngineExecuteByteCuteByteCuteByteCuteBytecuteBytecuteByteCuteByteCuteByteCuteBytecuteByteCodeNinstRonctientions.3)Memo.3)Memo


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

记事本++7.3.1
好用且免费的代码编辑器

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具