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)