I'm trying to convert back from a parallel collection to a regular map. According to the api, if I call toMap on any appropriately defined parallel collection, it's supposed to return a standard Map, but it's returning ParMap over a flattened collection of iterables.
I have a
val task: Stream[Future[Iterable[Tuple2[String, String]]]]
And from which I get:
val res: ParSeq[Iterable[Tuple2[String, String]]] = tasks.par.map(f => f.apply())
Finally:
val finalresult = res.flatten.toMap
Unfortunately, the type of finalresult
is ParMap[String, String]
.
On the other hand, if I call it like:
tasks.par.map(f => f.apply()).reduce(_++_).toMap
then the return type is Map[String, String]
.
Can someone tell me why this is? And (out of curiosity) how I can force convert a ParMap
to a Map
when scala won't let me?
As you go explicitly from sequential to parallel collection via .par
, you go back to sequential via .seq
. Since sets and maps have parallel implementations, toMap
and toSet
calls leave the collection in the current domain.
The example of reduce
works because it, well, reduces the collection (the outer ParSeq
disappears, leaving you with the inner (sequential) Iterable[Tuple2[...]]
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With