从scala并行集合转换为常规集合

时间:2012-08-18 23:29:02

标签: scala parallel-processing scala-collections

我正在尝试从并行集合转换回常规地图。根据api,如果我在任何适当定义的并行集合上调用map,它应该返回一个标准的Map,但它会在一个扁平的迭代集合上返回ParMap。

我有一个

val task: Stream[Future[Iterable[Tuple2[String, String]]]]

我从中得到:

val res: ParSeq[Iterable[Tuple2[String, String]]] = tasks.par.map(f => f.apply())

最后:

val finalresult = res.flatten.toMap

不幸的是,finalresult的类型为ParMap[String, String]

另一方面,如果我称之为:

tasks.par.map(f => f.apply()).reduce(_++_).toMap

然后返回类型为Map[String, String]

有人可以告诉我为什么会这样吗?并且(出于好奇)当scala不让我时,我如何强制将ParMap转换为Map

1 个答案:

答案 0 :(得分:44)

当您通过.par明确地从顺序收集转移到并行收集时,您将通过.seq返回顺序。由于集合和地图具有并行实现,toMaptoSet调用会将集合保留在当前域中。

reduce的示例有效,因为它会减少集合(外部ParSeq消失,留下内部(顺序)Iterable[Tuple2[...]])。