30

我正在尝试从并行集合转换回常规地图。根据 api,如果我在任何适当定义的并行集合上调用 toMap,它应该返回一个标准 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

不幸的是,类型finalresultParMap[String, String].

另一方面,如果我这样称呼它:

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

那么返回类型是Map[String, String].

有人能告诉我这是为什么吗?并且(出于好奇)我如何在 scala 不允许我的情况下强制将 a 转换ParMap为 a Map

4

1 回答 1

53

当您通过显式从顺序收集到并行收集时.par,您将返回到顺序通过.seq。由于集合和映射具有并行实现,toMap并且toSet调用将集合留在当前域中。

工作的例子,reduce因为它减少了集合(外部ParSeq消失,留下内部(顺序)Iterable[Tuple2[...]])。

于 2012-08-18T23:42:18.790 回答