关于Scala中的 yield 命令和以下示例:
val values = Set(1, 2, 3)
val results = for {v <- values} yield (v * 2)
聚苯乙烯。我知道这个例子没有遵循推荐的功能方式(使用 map ),但它只是一个例子。
答案 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)
答案 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