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)
不幸的是,类型finalresult是ParMap[String, String].
另一方面,如果我称之为:
tasks.par.map(f => f.apply()).reduce(_++_).toMap
Run Code Online (Sandbox Code Playgroud)
那么返回类型是Map[String, String].
谁能告诉我为什么会这样?和(出于好奇),我怎么可以强制转换ParMap到Map时斯卡拉不会放过我?
0__*_*0__ 47
当你明确地从顺序收集到并行收集时.par,你会回到顺序通过.seq.由于集合和映射具有并行实现,toMap因此toSet调用将集合保留在当前域中.
有效的例子,reduce因为它减少了收集(外部ParSeq消失,留下内部(顺序)Iterable[Tuple2[...]]).