30

並列コレクションから通常のマップに変換し直そうとしています。APIによると、適切に定義された並列コレクションでtoMapを呼び出すと、標準の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てaを強制的に変換することができますか?Map

4

1 に答える 1

53

を介してシーケンシャルコレクションからパラレルコレクションに明示的に移動すると.par、を介してシーケンシャルコレクションに戻ります.seq。セットとマップには並列実装があるためtoMaptoSet呼び出しはコレクションを現在のドメインに残します。

作品の例はreduce、コレクションを減らすためです(外側ParSeqが消え、内側(シーケンシャル)が残りますIterable[Tuple2[...]])。

于 2012-08-18T23:42:18.790 に答える