将Scala迭代器转换为向量

将Scala迭代器转换为向量,scala,vector,Scala,Vector,如何将包含数千个对象的scala.collection.Iterator转换为scala.collection.immutable.Vector 我不相信我可以使用\u*,因为项目太多。您可以使用来执行eq。它不会静态地返回一个向量,但实际上它是一个 Vector() ++ myIterator 用正确的类型给出正确的东西。对于非常小的向量和迭代器,在高性能循环中,您可能希望 val b = Vector.newBuilder[WhateverType] while (myIterator.h

如何将包含数千个对象的
scala.collection.Iterator
转换为
scala.collection.immutable.Vector


我不相信我可以使用
\u*
,因为项目太多。

您可以使用
来执行eq
。它不会静态地返回一个
向量,但实际上它是一个

Vector() ++ myIterator
用正确的类型给出正确的东西。对于非常小的向量和迭代器,在高性能循环中,您可能希望

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

这是创建向量所需的最小工作量(据我所知)
toIndexedSeq本质上是这样做的,但返回的是一个更通用的类型(因此,即使它现在确实返回一个
向量,也不能保证是
向量)。

您可以使用
.*
,因为它所做的只是传递一个带有所有参数的
Seq
。但是,这将是低效的,因为它将首先将迭代器转换为一个序列,然后使用该序列创建另一个序列。

迭代器现在支持.toVector,因为至少Scala 11(可能更早)

产生:

res1: scala.collection.immutable.Vector[Thing] = Vector(Thing@22da2fe6,
 Thing@100ad67e, Thing@713a35c5)

很可能OP确实只需要一些索引序列,而不一定是一个向量。你是对的。我需要(接近)恒定时间随机访问和长度计算。
res1: scala.collection.immutable.Vector[Thing] = Vector(Thing@22da2fe6,
 Thing@100ad67e, Thing@713a35c5)