从Scala并行集合转换为普通集合

32
我正在尝试将并行集合转换回普通的Map。根据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

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

另一方面,如果我这样调用:

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

如果函数返回类型是Map[String, String],那是为什么?另外(出于好奇),当scala不允许我时,我怎样强制将ParMap转换为Map

1个回答

56

当你通过.par从顺序集合明确切换到并行集合时,你可以通过.seq返回到顺序集合。因为集合和映射有并行实现,toMaptoSet调用将保留当前域中的集合。

reduce的示例之所以有效,是因为它可以减少集合(外部的ParSeq消失,只剩下内部(顺序)的Iterable[Tuple2[...]])。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接