首页 文章

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

提问于
浏览
25

我正试图从并行集合转换回常规 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 回答

  • 44

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

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

相关问题