Подтвердить что ты не робот

Преобразование из параллельной коллекции scala в обычную коллекцию

Я пытаюсь преобразовать обратно из параллельной коллекции в обычную карту. Согласно api, если я вызываю toMap на любой подходящий параллельный набор, он должен возвращать стандартную карту, но возвращает 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].

Может кто-нибудь сказать мне, почему это? И (из любопытства), как я могу заставить преобразовать a ParMap в Map, когда scala не позволит мне?

4b9b3361

Ответ 1

Поскольку вы явно переходите из последовательного параллельного набора через .par, вы возвращаетесь к последовательному через .seq. Поскольку множества и карты имеют параллельные реализации, вызовы toMap и toSet оставляют коллекцию в текущем домене.

Пример reduce работает, потому что он, ну, уменьшает коллекцию (внешний ParSeq исчезает, оставляя вас с внутренним (последовательным) Iterable[Tuple2[...]]).