在 scala 上映射 List/Seq

map on a scala List/Seq

我有下面的简单代码

private def tt(l:Seq[Int]):Seq[Future[Unit]] = {
    val aa = l.map(_=>Future.successful(()))
    aa
  }

我可以很容易地理解我正在 returning Future[Unit] type corresponding to each element of my sequence "l" that is passed to method tt. 的事实。因此很容易说 "aa"Seq[Future[Unit]] 类型。我无法理解的是,当我的 "l" 序列的长度为零时,将永远不会执行映射,为什么以及如何才能得到 Seq[Future[Unit]] 因为我已经明确地输入了 return 类型,并且显然 scala 很高兴无论 "l" 是什么,即使是空的,“aa' 仍然会导致 Seq[Future[Unit]]。但我没有得到为什么

...when my "l", the sequence is of length zero, map will never be executed....

以上说法不正确。 map,当在空序列上调用时,执行的:在空序列上调用mapreturn是一个空序列。

当你将空Seq传递给tt时,return类型确实是Seq[Future[Unit]]。 returned 是一个空的 Seq[Future[Unit]]:

scala> def tt(l:Seq[Int]):Seq[Future[Unit]] = {
 |     val aa = l.map(_=>Future.successful(()))
 |     aa
 |   }
tt: (l: Seq[Int])Seq[scala.concurrent.Future[Unit]]

scala> tt(Seq())
res0: Seq[scala.concurrent.Future[Unit]] = List()

在上面的代码中,map l 上执行的,即使 l 为空。

这与在任何类型的空 Seq 上调用 map 相同。例如,要将 Seq[String] 转换为 Seq[Int]

scala> Seq[String]().map(_.toInt)
res2: Seq[Int] = List()

在空 Seq[String] 上调用 .map(_.toInt) 的结果是空 Seq[Int]