为什么在 Java Streams 中,filter() 在 flatMap() 之后不是“完全”惰性的?
在 Java 8 流中,中间操作如filter() 和 flatMap() 是惰性的,这意味着它们在调用像 findFirst() 这样的终端操作之前不会执行。然而,当 filter() 跟随 flatMap() 时,这种惰性并没有完全实现,从而导致意外的行为。
考虑这个代码示例:
Stream.of(1, 2, 3) .filter(i -> { System.out.println(i); return true; }) .findFirst() .get();
输出显示只有第一个打印了元素,表明filter()是懒惰的,并且在满足条件时短路。相比之下:
Stream.of(1, 2, 3) .flatMap(i -> Stream.of(i - 1, i, i + 1)) .flatMap(i -> Stream.of(i - 1, i, i + 1)) .filter(i -> { System.out.println(i); return true; }) .findFirst() .get();
令人惊讶的是,所有元素都被打印出来。即使 filter() 立即满足其条件,它也会继续处理流的后续元素。
原因
此行为是由于 Java Streams 实现造成的。在 flatMap() 之后,流不再包含原始元素。相反,它包含由 flatMap() 生成的一系列扁平化元素。当filter()跟随时,它对这些扁平化的元素进行操作,而不是原始流。
findFirst()中使用的forEachWithCancel()的实现,不断地在spliterator上调用tryAdvance(),直到sink请求取消或者 spliterator 已耗尽。在 flatMap() 的情况下,即使 filter() 已经找到匹配项,分裂器也会继续前进,而不会提前终止。
修复
这个问题已在 Java 10 中得到解决,并向后移植到 Java 8。现在,当像 filter() 这样的短路操作被执行时,该实现允许在 flatMap() 中提前终止。
结论
可以理解的是,为什么filter()在flatMap()之后表现得好像不是懒惰的,这可能会令人困惑。底层 Java Streams 实现规定了这种行为,后来在 Java 10 中解决了这一问题,并向后移植到 Java 8。这种理解对于有效处理此类场景至关重要。
以上是为什么 Java Streams 中的'filter()”在'flatMap()”之后显得不那么懒惰?的详细内容。更多信息请关注PHP中文网其他相关文章!

Java'splatFormIndependecemeansDeveloperScanWriteCeandeCeandOnanyDeviceWithouTrecompOlding.thisAcachivedThroughThroughTheroughThejavavirtualmachine(JVM),WhaterslatesbyTecodeDecodeOdeIntComenthendions,允许univerniverSaliversalComplatibilityAcrossplatss.allospplats.s.howevss.howev

要设置JVM,需按以下步骤进行:1)下载并安装JDK,2)设置环境变量,3)验证安装,4)设置IDE,5)测试运行程序。设置JVM不仅仅是让其工作,还包括优化内存分配、垃圾收集、性能调优和错误处理,以确保最佳运行效果。

toensurejavaplatFormIntence,lofterTheSeSteps:1)compileAndRunyOpplicationOnmultPlatFormSusiseDifferenToSandjvmversions.2)upureizeci/cdppipipelinelikeinkinslikejenkinsorgithikejenkinsorgithikejenkinsorgithikejenkinsorgithike forautomatecross-plateftestesteftestesting.3)

javastandsoutsoutinmoderndevelopmentduetoitsrobustfeatureslikelambdaexpressions,streams,andenhanced concurrencysupport.1)lambdaexpressionssimplifyfunctional promprogientsmangional programmanging,makencodemoreconciseandable.2)

Java的核心特点包括平台独立性、面向对象设计和丰富的标准库。1)面向对象设计通过多态等特性使得代码更加灵活和可维护。2)垃圾回收机制解放了开发者的内存管理负担,但需要优化以避免性能问题。3)标准库提供了从集合到网络的强大工具,但应谨慎选择数据结构以保持代码简洁。

Yes,Javacanruneverywhereduetoits"WriteOnce,RunAnywhere"philosophy.1)Javacodeiscompiledintoplatform-independentbytecode.2)TheJavaVirtualMachine(JVM)interpretsorcompilesthisbytecodeintomachine-specificinstructionsatruntime,allowingthesameJava

jdkincludestoolsfordevelveping and compilingjavacode,whilejvmrunsthecompiledbytecode.1)jdkcontainsjre,编译器和授权。2)

Java的关键特性包括:1)面向对象设计,2)平台独立性,3)垃圾回收机制,4)丰富的库和框架,5)并发支持,6)异常处理,7)持续演进。Java的这些特性使其成为开发高效、可维护软件的强大工具。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

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

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

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