use*_*040 7 functional-programming scala flatmap
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)
Run Code Online (Sandbox Code Playgroud)
这两个功能有什么区别吗?何时使用一个而不是另一个?有任何权衡吗?
你可以查看flatMap(identity)为map(identity).flatten.(当然它没有这样实现,因为它需要两次迭代).
map(identity)给你相同的集合,所以最后它只是相同的flatten.
我个人会坚持flatten,因为它更短/更容易理解和设计来完全做到这一点.
从概念上讲,结果没有差异...
flatMap要花更多的时间才能产生相同的结果...
flatMap,map&然后flatten和flatten对象测试扩展了应用{
//平面图
println(timeElapsed(List(List(1、2、3、4),List(5、6、7、8))。flatMap(identity)))
//映射,然后展平
println(timeElapsed(List(List(1、2、3、4),List(5、6、7、8))。map(identity).flatten))
//展平
println(timeElapsed(List(List(1,2,3,4),List(5,6,7,8))。flatten))
/ **
* 时间流逝
* /
def timeElapsed [T](block:=> T):T = {
val start = System.nanoTime()
val res =区块
val totalTime = System.nanoTime-开始
println(“经过时间:%1d纳秒” .format(totalTime))
资源
}
}
二者flatMap并flatten重复几次后,用相同的结果执行
flatten是有效的耗用时间:2915949纳秒 清单(1、2、3、4、5、6、7、8) 经过时间:1060826纳秒 清单(1、2、3、4、5、6、7、8) 耗用时间:81172纳秒 清单(1、2、3、4、5、6、7、8)