Преобразование из параллельной коллекции 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 не позволит мне?
Ответы
Ответ 1
Поскольку вы явно переходите из последовательного параллельного набора через .par
, вы возвращаетесь к последовательному через .seq
. Поскольку множества и карты имеют параллельные реализации, вызовы toMap
и toSet
оставляют коллекцию в текущем домене.
Пример reduce
работает, потому что он, ну, уменьшает коллекцию (внешний ParSeq
исчезает, оставляя вас с внутренним (последовательным) Iterable[Tuple2[...]]
).