Scala集合:一次性转换集合的内容和类型

Eug*_*Loy 5 scala scala-collections

我正在寻找一种有效转换集合的内容类型的方法.

例如,应用于mapa Set并获得结果List.

请注意,我想在将转换应用于源集合时构建结果集合(即,不创建中间集合,然后将其转换为所需类型).

到目前为止,我已经提出了这个问题(为了在增加每个元素的同时Set进行转换):Listset

val set = Set(1, 2, 3)

val cbf = new CanBuildFrom[Set[Int], Int, List[Int]] {
    def apply(from: Set[Int]): Builder[Int, List[Int]] = List.newBuilder[Int]
    def apply(): Builder[Int, List[Int]] = List.newBuilder[Int]
}

val list: List[Int] = set.map(_ + 1)(cbf)
Run Code Online (Sandbox Code Playgroud)

...但我觉得应该有更简短和优雅的方法来做到这一点(CanBuildFrom每次我需要时都不需要手动执行).

任何想法如何做到这一点?

Tra*_*own 7

这正是scala.collection.breakOut是,稍后即联想到了CanBuildFrom你需要的,如果你告诉它所需的新的集合类型:

import scala.collection.breakOut

val xs: List[Int] = Set(1, 2, 3).map(_ + 1)(breakOut)
Run Code Online (Sandbox Code Playgroud)

这只会遍历集合一次.有关详细信息,请参阅此答案.