我正在尝试从并行集合转换回常规地图。根据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
?
答案 0 :(得分:44)
当您通过.par
明确地从顺序收集转移到并行收集时,您将通过.seq
返回顺序。由于集合和地图具有并行实现,toMap
和toSet
调用会将集合保留在当前域中。
reduce
的示例有效,因为它会减少集合(外部ParSeq
消失,留下内部(顺序)Iterable[Tuple2[...]]
)。