将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)