我正试图从并行集合转换回常规 Map . 根据api,如果我在任何适当定义的并行集合上调用map,它应该返回一个标准的Map,但是它会在一个扁平的iterables集合上返回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 回答
当你通过
.par
明确地从顺序收集到并行收集时,你会回到顺序通过.seq
. 由于集合和映射具有并行实现,toMap
和toSet
调用将集合保留在当前域中 .reduce
的例子是有效的,因为它减少了集合(外部ParSeq
消失了,留下你的内部(顺序)Iterable[Tuple2[...]]
) .