如何将java.util.List [Array [String]]映射到Scala向量?

时间:2014-07-11 11:32:38

标签: scala data-structures

背景

我有一个名为java.util.List[Array[String]]的{​​{1}}直接来自opencsv的rawdata

CSVReader

目前,我正在循环val reader = new CSVReader( new FileReader( "foobar.csv" )) val rawdata = reader.readAll(); 并抓取rawdatarawdata.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]]

1 个答案:

答案 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

最简单的版本可能是最好的,除非你确定这是你程序的瓶颈。