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

时间:2014-06-09 16:58:31

标签: scala scala-collections

我正在寻找一种有效转换广告内容类型的方法。

例如,将map应用于Set,并将结果显示为List

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

到目前为止,我已经提出了这个问题(Set转换为List,同时递增set的每个元素):

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)

...但我觉得应该有更简短而优雅的方法(每次我需要时都不会手动实现CanBuildFrom)。

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

2 个答案:

答案 0 :(得分:7)

这正是scala.collection.breakOut的含义,如果你告诉它所需的新集合类型,它会让你想起你需要的CanBuildFrom

import scala.collection.breakOut

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

这只会遍历集合一次。有关详细信息,请参阅this answer

答案 1 :(得分:1)

我认为这可能会做你想要的,虽然我不是100%肯定所以也许有人可以证实:

(Set(1, 2, 3).view map (_ + 1)).toList
在这种情况下,

view会创建一个IterableView,当您在其上调用map时,它实际上不会执行映射。调用toList时,将执行映射并使用结果构建列表。