背景
我有一个名为java.util.List[Array[String]]
的{{1}}直接来自opencsv的rawdata
CSVReader
目前,我正在循环val reader = new CSVReader( new FileReader( "foobar.csv" ))
val rawdata = reader.readAll();
并抓取rawdata
和rawdata.get(i)(4)
以获取记录rawdata.get(i)(5)
中的字段4和5,其中i从0变为99,999。
问题
相反,我想将i
映射到rawdata
,其中Vector[Record]
的构造函数从上面获取字段4和5。 Record
中有100,000条记录。
这是我遇到一些认知失调的地方,因为rawdata
是不可变的,但是Vector
要求我循环它(我没有java.util.List[Array[String]]
来调用,AFAIK) ...
问题
如何将map
映射到java.util.List[Array[String]]
?
答案 0 :(得分:3)
Scala提供了一系列来自Java集合的转换,您可以像这样使用:
import scala.collection.JavaConverters._
val records = rawdata.asScala.toVector.map(toRecord)
toRecord
的方法如下:
def toMethod(fields: Array[String]) = Record(fields(4), fields(5))
您还可以使用函数文字执行映射操作:
val records = rawdata.asScala.toVector.map { fields =>
Record(fields(4), fields(5))
}
这两个版本都会将java.util.List
转换为scala.collection.mutable.Buffer
,然后转换为Vector
,然后执行映射操作。你可以保存一个这样的中间集合:
val records: Vector[Record] = rawdata.asScala.map(toRecord)(collection.breakOut)
或者你可以转换为Java端的迭代器:
val records = rawdata.iterator.asScala.map(toRecord).toVector
最简单的版本可能是最好的,除非你确定这是你程序的瓶颈。