Scala:从一种类型的集合到另一种集合

时间:2011-07-23 12:58:56

标签: scala collections yield

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

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

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

    聚苯乙烯。我知道这个例子没有遵循推荐的功能方式(使用 map ),但它只是一个例子。

  • 3 个答案:

    答案 0 :(得分:22)

    编译器使用this方案将for理解翻译为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

    答案 1 :(得分:4)

    如果您使用map / flatmap / filter代替理解,则可以使用scala.collection.breakOut创建不同类型的集合:

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

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

    答案 2 :(得分:1)

    试试这个:

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