我有以下简单的代码
private def tt(l:Seq[Int]):Seq[Future[Unit]] = {
val aa = l.map(_=>Future.successful(()))
aa
}
我很容易理解我正在返回的事实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]]因为我有明确地给出了返回类型,并且显然scala很高兴无论什么是“l”即使是空的,“aa”仍然会导致Seq [Future [Unit]]。但是我不明白为什么
答案 0 :(得分:5)
...当我的“l”,序列的长度为零时,地图永远不会被执行....
以上陈述不正确。 map
,当调用空序列时, 执行:在空序列上调用map
会返回一个空序列。
将空Seq
传递给tt
时,返回类型确实为Seq[Future[Unit]]
。返回的是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
为空。
在任何类型的空map
上调用Seq
都是一样的。例如,要将Seq[String]
转换为Seq[Int]
:
scala> Seq[String]().map(_.toInt)
res2: Seq[Int] = List()
在空.map(_.toInt)
上调用Seq[String]
的结果为空Seq[Int]
。