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

Zec*_*tes 15 collections scala yield

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

val values = Set(1, 2, 3)
val results = for {v <- values} yield (v * 2)
Run Code Online (Sandbox Code Playgroud)

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

    PS.我知道这个例子没有遵循推荐的功能方式(也就是使用map),但它只是一个例子.

  • mis*_*tor 22

    使用方案for,编译器将解析转换为map/ flatMap/ filter调用.

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

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

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

    推荐阅读: Scala集合的体系结构

    • 太好了!所以你_can_使用`breakOut`来进行理解 (2认同)