Scala 列表到 Seq

Scala List into Seq

我有这样的 scala 代码

val tokens = List("the", "program", "halted")
val test = for (c <- tokens) yield Seq(c) 

此处测试返回 List(Seq(String)),但我只期待 Seq(String)。也许对于有经验的人来说这很简单,但我尝试了所有我在基础水平上知道的方法,但没有看。如果有人觉得很容易,请帮助我。

ListSeq 的子类型。你根本不需要任何 for-comprehensions,你只需要归因于类型:

val test: Seq[String] = tokens

或:

val test = (tokens: Seq[String])

首先,List 在幕后扩展了 Seq,所以你确实有一个 Seq。您可以在定义级别向下转换。

val tokens: Seq[String] = List("the", "program", "halted")

现在回答您的问题,在 Scala 中,集合转换通常由 toXXX 方法促进。

val tokens: Seq[String] = List("the", "program", "halted").toSeq

在更高级的阅读中,请看CanBuildFrom,这是幕后的魔法。

tokens.toSeq 可以,但是如果你在命令行中输入这个,你会看到 Seq 无论如何都会在后台创建一个 List

scala> val tokens = List("the", "program", "halted")
tokens: List[String] = List(the, program, halted)

scala> tokens.toSeq
res0: scala.collection.immutable.Seq[String] = List(the, program, halted)

Seq 很有趣。如果您的数据更适合存储在 List 中,它将把它变成一个列表;否则,它将把它变成 Vector(向量本身就很有趣……)——因为 SeqListVector 的超类型。如果有的话,除非您有特定的用例,否则您真的应该默认使用 Vector 而不是其他集合类型,但这是对另一个问题的回答。

当然还有其他选择:

scala> val test: Seq[String] = tokens
test: Seq[String] = List(the, program, halted)

scala> val test2: Seq[String] = for (token <- tokens) yield token
test2: Seq[String] = List(the, program, halted)

scala> val test3 = (tokens: Seq[String])
test3: Seq[String] = List(the, program, halted)

scala> val test4: Seq[String] = tokens.mkString(" ").split(" ").toSeq
test4: Seq[String] = WrappedArray(the, program, halted)

(开玩笑说最后一个)

不过要注意的是,您只需将变量类型指定为 Seq[String],Scala 会根据它处理 SeqList、[=17 的方式来处理它=] 等等。