【问题标题】:map on a scala List/Seq在 Scala List/Seq 上映射
【发布时间】:2017-06-21 04:03:31
【问题描述】:

我有下面的简单代码

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”序列的长度为零时,map 将永远不会被执行,为什么以及如何才能获得 Seq[Future[Unit]] 因为我有明确输入返回类型,显然 scala 很高兴无论“l”是什么,即使为空,“aa' 仍然会导致 Seq[Future[Unit]]。但我不明白为什么

【问题讨论】:

  • 一个空的 Seq 真的可以形成任何类型。它只是空的。不管它是零Ints 还是零Future[Unit]s。它仍然什么都没有。 NoneOption 也一样,空的 Option 可以是任何类型,因为它没有实际值。

标签: scala scala-collections


【解决方案1】:

...当我的“l”序列长度为零时,map 将永远不会被执行......

上述说法不正确。 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()

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多