Scala 列表到 Seq

JSF*_*ner 1 scala scala-collections

我有一个像这样的 Scala 代码

val tokens = List("the", "program", "halted")
val test = for (c <- tokens) yield Seq(c) 
Run Code Online (Sandbox Code Playgroud)

这里测试返回 List(Seq(String)) 但我只期待 Seq(String) 。对于有经验的人来说,这可能很简单,但我尝试了所有我在基本级别上知道的方法,但没有看。如果有人觉得这很容易,请帮助我。

Jam*_*ley 5

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)
Run Code Online (Sandbox Code Playgroud)

Seq很有趣。如果您的数据更适合存储在 a 中List,它将把它变成一个列表;否则,它会将它变成 a Vector(并且 Vectors 本身很有趣......) - 就像andSeq的超类型一样。如果有的话,除非您有特定用例,否则您应该真正默认使用其他集合类型,但这是另一个问题的答案。ListVectorVector

其他选择当然是:

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)
Run Code Online (Sandbox Code Playgroud)

(只是在开玩笑说最后一个)

外卖虽然是你可以指定变量类型Seq[String]和Scala将对待它,由于它如何处理SeqListVector等发动机罩下。