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

Jas*_*ond 26 parallel-processing scala scala-collections

我正试图从并行集合转换回常规地图.根据api,如果我在任何适当定义的并行集合上调用map,它应该返回一个标准的Map,但是它会在一个扁平的iterables集合上返回ParMap.

我有一个

val task: Stream[Future[Iterable[Tuple2[String, String]]]]
Run Code Online (Sandbox Code Playgroud)

从中得到:

val res: ParSeq[Iterable[Tuple2[String, String]]] = tasks.par.map(f => f.apply())
Run Code Online (Sandbox Code Playgroud)

最后:

val finalresult = res.flatten.toMap
Run Code Online (Sandbox Code Playgroud)

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

另一方面,如果我称之为:

tasks.par.map(f => f.apply()).reduce(_++_).toMap
Run Code Online (Sandbox Code Playgroud)

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

谁能告诉我为什么会这样?和(出于好奇),我怎么可以强制转换ParMapMap时斯卡拉不会放过我?

0__*_*0__ 47

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

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

  • 我爱你.--- (3认同)