【问题标题】:Scala List into SeqScala List 到 Seq
【发布时间】:2018-07-12 21:18:43
【问题描述】:

我有一个这样的 scala 代码

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

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

【问题讨论】:

  • 您正在遍历一个字符串列表,将每个字符串转换为仅包含该字符串的单例序列,从而生成字符串的单例序列列表

标签: scala scala-collections


【解决方案1】:

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 会根据它在后台处理 SeqListVector 等的方式来处理它。

【讨论】:

  • ...您还在开玩笑说第二个,因为这只是将标识函数应用于列表的一种非常低效的方式;)哪种方式让您留下test 和@987654338 @。我也有模糊的怀疑,我已经在某处看到了第一个和第三个变体的解决方案^^
  • 第二个只是修复了 OP 最初的解决方案尝试,但我承认这是一种愚蠢的做法。老实说test3 来自我在谷歌上搜索了许多愚蠢的方法并将它们粘贴到我的终端中。我不知道这是来自这个问题!不过,我要感谢test;我一个人想到了那个。我不是一个聪明的裤子吗? ;)
  • 谷歌搜索类似问题的问题在于,新问题几乎立即被编入索引,因此当您搜索问题Q0 的重复项时,第一次谷歌点击会返回相同的问题Q0 ;)
【解决方案2】:

ListSeq 的子类型。您根本不需要任何理解,您只需确定类型:

val test: Seq[String] = tokens

或:

val test = (tokens: Seq[String])

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2016-08-22
      • 2018-06-29
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多