Question Conversion de la collection parallèle scala à la collecte régulière


J'essaie de reconvertir d'une collection parallèle en une carte régulière. Selon l'API, si j'appelle toMap sur une collection parallèle définie de manière appropriée, elle est censée renvoyer une carte standard, mais elle renvoie ParMap sur une collection aplatie d'itérables.

j'ai un

val task: Stream[Future[Iterable[Tuple2[String, String]]]]

Et à partir de laquelle je reçois:

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

Finalement:

val finalresult = res.flatten.toMap

Malheureusement, le type de finalresult est ParMap[String, String].

Par contre, si je l'appelle comme:

tasks.par.map(f => f.apply()).reduce(_++_).toMap

alors le type de retour est Map[String, String].

Est-ce que quelqu'un peut me dire pourquoi c'est? Et (par curiosité) comment je peux forcer la conversion d'un ParMap à un Map quand scala ne me laissera pas?


25
2017-08-18 23:29


origine


Réponses:


Comme vous allez explicitement de la collecte séquentielle à parallèle via .par, vous revenez au via séquentiel .seq. Puisque les ensembles et les cartes ont des implémentations parallèles, toMap et toSet les appels quittent la collection dans le domaine actuel.

L'exemple de reduce fonctionne parce que, bien, réduit la collection (l'extérieur ParSeq disparaît, vous laissant à l'intérieur (séquentiel) Iterable[Tuple2[...]]).


42
2017-08-18 23:42