Преобразование итератора 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])