Преобразование итератора Scala в вектор

Как преобразовать scala.collection.Iterator, содержащий тысячи объектов, в scala.collection.immutable.Vector?

Я не считаю, что я могу использовать _* из-за количества элементов.

Ответ 1

Вы можете

Vector() ++ myIterator

который дает правильную вещь с правильным типом. Для очень маленьких векторов и итераторов в высокопроизводительных циклах вы можете вместо этого

val b = Vector.newBuilder[WhateverType]
while (myIterator.hasNext) { b += myIterator.next }
b.result

который делает минимальную работу необходимой (насколько я знаю) для создания вектора. toIndexedSeq делает это по существу, но возвращает более общий тип (так что вы на самом деле не гарантировали Vector, даже если он возвращает Vector сейчас.)

Ответ 2

Вы можете использовать toIndexedSeq. Он не статически возвращает Vector, но на самом деле это один.

Ответ 3

Вы можете использовать _*, поскольку все, что он делает, это передать a Seq со всеми аргументами. Однако это будет неэффективно, поскольку он сначала преобразует итератор в последовательность, а затем использует эту последовательность для создания другой последовательности.

Ответ 4

Итератор теперь поддерживает .toVector, поскольку, как минимум, Scala 11 (а может и раньше).

class Thing
val myIterator = Iterator(new Thing, new Thing, new Thing)
myIterator.toVector

производит:

res1: scala.collection.immutable.Vector[Thing] = Vector([email protected],
 [email protected], [email protected])