Scala 展平和平面地图(标识)有什么区别吗?

Scala 展平和平面地图(标识)有什么区别吗?,scala,functional-programming,flatmap,Scala,Functional Programming,Flatmap,这两种功能有什么区别吗?什么时候使用一个比另一个合适?有什么折衷吗?您可以查看flatMap(identity)作为map(identity)。展平。(当然不是这样实现的,因为它需要两次迭代) map(identity)为您提供了相同的集合,因此最终它只与flatten相同 我个人会坚持使用扁平化,因为它较短/更容易理解,并且设计的目的就是要准确地做到这一点。从概念上讲,没有区别。实际上,flatte更有效,并且传达了更清晰的意图 通常,您不会直接使用identity。它更适用于作为参数传入或设

这两种功能有什么区别吗?什么时候使用一个比另一个合适?有什么折衷吗?

您可以查看
flatMap(identity)
作为
map(identity)。展平
。(当然不是这样实现的,因为它需要两次迭代)

map(identity)
为您提供了相同的集合,因此最终它只与
flatten
相同


我个人会坚持使用扁平化,因为它较短/更容易理解,并且设计的目的就是要准确地做到这一点。

从概念上讲,没有区别。实际上,
flatte
更有效,并且传达了更清晰的意图

通常,您不会直接使用
identity
。它更适用于作为参数传入或设置为默认值的情况。编译器可以对其进行优化,但您可能会对每个元素进行多余的函数调用

当您需要执行
映射
(具有
标识
以外的功能)时,可以使用
平面映射
,然后立即执行
平面化

从概念上讲,结果没有区别<代码>平面图正在使用 再多花点时间来产生相同的结果

我将以
flatMap
map
&然后
flatten
flatten
为例更实际地展示它
最后一句话(“您将使用…”)具有误导性,
flatmap
不能总是替换为
map
+
flatte
,它通常传达不同的含义computation@Chirlo,我认为你错了,但如果我错了,我愿意承认。你能提供一个反例吗?使用
map
+
flatten
你总能得到一个
列表
,其元素数量与原始列表相同。使用
flatmap
可以执行更多操作,例如
list.flatmap(x=>if(x>2)list(x,x,x,x)else list())
。这将产生(来自OPs示例):
列表(3,3,3,4,4,4)
。您可以实现
过滤器
takeWhile
。。。。对于
flatMap
,这是
map+flatten
无法做到的,您使用
map+flatten
的第一个示例是
list.map(x=>if(x>2)list(x,x,x,x)else list()).flatten
filter
list.map(x=>if(pred(x))list(x)else list()).flatten
。哦,好吧,我误解了这个例子,但是你可以得到两者不相等的地方,因为scala的
flatmap
签名(带有
CanBuildFrom
)。
scala> List(List(1), List(2), List(3), List(4))
res18: List[List[Int]] = List(List(1), List(2), List(3), List(4))

scala> res18.flatten
res19: List[Int] = List(1, 2, 3, 4)

scala> res18.flatMap(identity)
res20: List[Int] = List(1, 2, 3, 4)
object Test extends App { // flatmap println(timeElapsed(List(List(1, 2, 3, 4), List(5, 6, 7, 8)).flatMap(identity))) // map and then flatten println(timeElapsed(List(List(1, 2, 3, 4), List(5, 6, 7, 8)).map(identity).flatten)) // flatten println(timeElapsed(List(List(1, 2, 3, 4), List(5, 6, 7, 8)).flatten)) /** * timeElapsed */ def timeElapsed[T](block: => T): T = { val start = System.nanoTime() val res = block val totalTime = System.nanoTime - start println("Elapsed time: %1d nano seconds".format(totalTime)) res } } Elapsed time: 2915949 nano seconds List(1, 2, 3, 4, 5, 6, 7, 8) Elapsed time: 1060826 nano seconds List(1, 2, 3, 4, 5, 6, 7, 8) Elapsed time: 81172 nano seconds List(1, 2, 3, 4, 5, 6, 7, 8)