flatten和flatMap(身份)之间有什么区别吗?

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)

这两个功能有什么区别吗?何时使用一个而不是另一个?有任何权衡吗?

Kig*_*gyo 9

你可以查看flatMap(identity)map(identity).flatten.(当然它没有这样实现,因为它需要两次迭代).

map(identity)给你相同的集合,所以最后它只是相同的flatten.

我个人会坚持flatten,因为它更短/更容易理解和设计来完全做到这一点.


Ram*_*ram 5

从概念上讲,结果没有差异... flatMap要花更多的时间才能产生相同的结果...

我会用一个例子更实际地表现出来flatMapmap&然后flattenflatten

对象测试扩展了应用{
  //平面图
  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))
    资源
  }
}


二者flatMapflatten重复几次后,用相同的结果执行

结论: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)