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)。也许对于有经验的人来说这很简单,但我尝试了所有我在基础水平上知道的方法,但没有看。如果有人觉得很容易,请帮助我。
List
是 Seq
的子类型。你根本不需要任何 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
(向量本身就很有趣……)——因为 Seq
是 List
和 Vector
的超类型。如果有的话,除非您有特定的用例,否则您真的应该默认使用 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 会根据它处理 Seq
、List
、[=17 的方式来处理它=] 等等。
我有这样的 scala 代码
val tokens = List("the", "program", "halted")
val test = for (c <- tokens) yield Seq(c)
此处测试返回 List(Seq(String)),但我只期待 Seq(String)。也许对于有经验的人来说这很简单,但我尝试了所有我在基础水平上知道的方法,但没有看。如果有人觉得很容易,请帮助我。
List
是 Seq
的子类型。你根本不需要任何 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
(向量本身就很有趣……)——因为 Seq
是 List
和 Vector
的超类型。如果有的话,除非您有特定的用例,否则您真的应该默认使用 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 会根据它处理 Seq
、List
、[=17 的方式来处理它=] 等等。