我正在寻找一种有效转换广告内容和类型的方法。
例如,将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
)。
任何想法如何做到这一点?
答案 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
时,将执行映射并使用结果构建列表。