首页 文章

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

提问于
浏览
15

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

val values = Set(1, 2, 3)
val results = for {v <- values} yield (v * 2)
  • 任何人都可以解释Scala如何知道要收集哪种类型的集合?我知道它是基于值,但我如何编写复制产量的代码?

  • 我有什么方法可以改变收藏类型吗?在示例中,我希望结果是List类型而不是Set类型 .

  • 如果不这样,从一个集合转换到另一个集合的最佳方法是什么?我知道_:*,但由于Set不是Seq,这不起作用 . 到目前为止我能找到的最好的是val listResults = List()结果 .

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

3 回答

  • 22

    for comprehensions由编译器使用this scheme转换为 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)
    

    Recommended read: The Architecture of Scala Collections

  • 1

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

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

    如果你想构建自己的集合类(这对我来说最接近"replicating yield"),你应该看一下this tutorial .

  • 4

    试试这个:

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

相关问题