在Java8中,Stream.map()Stream.flatMap()方法之间有什么区别?

推荐答案

mapflatMap都可以应用于Stream<T>,它们都返回Stream<R>.不同之处在于,map操作 for each 输入值生成一个输出值,而flatMap操作 for each 输入值生成任意数(零或更多)的值.

这反映在每个操作的参数中.

map操作采用Function,输入流中的每个值调用Function,并生成一个结果值,该结果值被发送到输出流.

flatMap操作采用的函数在概念上希望使用一个值并生成任意数量的值.然而,在Java中,方法返回任意数量的值是很麻烦的,因为方法只能返回零或一个值.可以想象一个API,其中flatMap的mapper函数获取一个值并返回一个数组或List个值,然后将其发送到输出.鉴于这是streams库,表示任意数量的返回值的一种特别合适的方法是让mapper函数本身返回一个流!映射器返回的流中的值将从流中排出,并传递到输出流.每次调用mapper函数返回的值的"束"在输出流中根本没有区别,因此输出被称为"平坦"

典型的用法是,如果mapper函数flatMap想要发送零值,则返回Stream.empty(),如果想要返回多个值,则返回Stream.of(a, b, c)之类的值.但当然,任何流都可以返回.

Java相关问答推荐

使用Java使用fabric.io获取当前部署名称

[145007:JC_ILLEGAL_SYMBOL_CHARACTER保存时:griddb中的牧师

Java Swing绘制gif作为多个JSYS和JLabels的背景

Java字符串常数池困惑

如何计算内循环的时间复杂度?

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

如何使用jooq generator将表名和列名映射为人类可读的?

对Java中的通配符参数的混淆

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

JOOQ中的子查询使用的是默认方言,而不是配置的方言

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

如何集成语义发布和BitBucket(Java项目)

使用htmlunit和java单击按钮

Java中不兼容的泛型类型

Java堆中的许多java.time.ZoneRegion实例.ZoneId实例不应该被缓存吗?

有谁能帮我修一下这个吗?使输出变得更加整洁

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?

Java 21保护模式的穷尽性

Cucumber中第二个网页的类对象未初始化