【问题标题】:Scala: Yielding from one type of collection to anotherScala:从一种集合到另一种集合
【发布时间】:2011-10-11 15:31:00
【问题描述】:

关于 Scala 中的 yield 命令和以下示例:

val values = Set(1, 2, 3)
val results = for {v <- values} yield (v * 2)

  • 谁能解释一下 Scala 如何知道要生成哪种类型的集合?我知道它基于 values,但我将如何编写复制 yield 的代码?
  • 有什么方法可以让我更改要让出的集合的类型吗?在示例中,我希望 results 的类型为 List 而不是 Set
  • 如果做不到这一点,从一个集合转换到另一个集合的最佳方法是什么?我知道 _:*,但作为一个 Set 不是一个 Seq 这不起作用。到目前为止我能找到的最好的是 val listResults = List() ++ results

    附言。我知道该示例没有遵循推荐的功能方式(即使用 map),但这只是一个示例。

  • 【问题讨论】:

    标签: scala collections yield


    【解决方案1】:

    试试这个:

    val values = Set(1, 2, 3)
    val results = for {v <- values} yield (v * 2).toList
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    【解决方案2】:

    for 理解由编译器转换为使用 this 方案的 map/flatMap/filter 调用。

    This excellent answer by Daniel 回答您的第一个问题。

    要更改结果集合的类型,您可以使用collection.breakout(在我上面链接的帖子中也有说明。)

    scala> val xs = Set(1, 2, 3)
    xs: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
    
    scala> val ys: List[Int] = (for(x <- xs) yield 2 * x)(collection.breakOut)
    ys: List[Int] = List(2, 4, 6)
    

    您可以使用以下方法之一将Set 转换为List

    scala> List.empty[Int] ++ xs
    res0: List[Int] = List(1, 2, 3)
    
    scala> xs.toList
    res1: List[Int] = List(1, 2, 3)
    

    推荐阅读:The Architecture of Scala Collections

    【讨论】:

    • 不错!所以你可以breakOut与for理解一起使用
    • 我到底怎么会错过 toList 方法?!非常感谢,链接非常有用。
    • 就个人而言,我更喜欢this question,而不是您选择解释如何翻译理解的那个。再说一次,你回答了你链接的那个,我回答了另一个,所以也许我们有偏见。 :-)
    • @Daniel:我以前从来没有遇到过那个线程(可以追溯到我什至没有听说过 Scala 的时候)。这是一个很好的答案。我赞成它,并将其链接到我的答案中。 :-)
    • 您不应该删除指向您自己答案的链接。这也是一个很好的答案,有时,人们通过比较同一问题的不同答案来学习一些东西。
    【解决方案3】:

    如果您使用 map/flatmap/filter 而不是 for comprehension,则可以使用 scala.collection.breakOut 创建不同类型的集合:

    scala> val result:List[Int] = values.map(2*)(scala.collection.breakOut)
    result: List[Int] = List(2, 4, 6)
    

    如果您想构建自己的集合类(这对我来说是最接近“复制产量”的东西),您应该看看 this tutorial

    【讨论】:

    • 你实际上也可以用 for 来做到这一点(令我惊讶的是): (for(v
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多