this question的答案很好地解释了如何使用Scala的Java转换器将Java列表更改为Scala列表。不幸的是,我需要将列表列表从Java转换为Scala类型,并且该解决方案不起作用:
// pseudocode
java.util.List[java.util.List[String]].asScala
-> scala.collection.immutable.List[java.util.List[String]]
有没有办法在没有对Java对象进行O(N)迭代的情况下进行此转换?
答案 0 :(得分:3)
你也需要转换嵌套列表,但这需要前面的O(n):
import scala.collection.JavaConverters._
val javaListOfLists = List(List("a", "b", "c").asJava, List("d", "e", "f").asJava).asJava
val scalaListOfLists = javaListOfLists.asScala.toList.map(_.asScala.toList)
或者,您可以将外部列表转换为Stream [List [T]],这只会在您访问每个项目时应用转化费用
val scalaStreamOfLists = javaListOfLists.asScala.toStream.map(_.asScala.toList)
如果您根本不想支付转换成本,可以在java.util.List周围编写一个包装器,它会为您提供一个scala集合接口。对此的反击将是:
def wrap[T](javaIterator: java.util.Iterator[T]): Stream[T] = {
if (javaIterator.hasNext)
javaIterator.next #:: wrap(javaIterator)
else
empty
}
val outerWrap = wrap(javaListOfLists.iterator).map(inner => wrap(inner.iterator()))
答案 1 :(得分:0)
或者您可以使用我为此专门编写的scalaj-collection库
import com.daodecode.scalaj.collection._
val listOfLists: java.util.List[java.util.List[String]] = ...
val s: mutable.Seq[mutable.Seq[String]] = listOfLists.deepAsScala
就是这样。它会将所有嵌套的java集合和原始类型转换为scala版本。您还可以使用deepAsScalaImmutable
直接转换为不可变数据结构(当然还有一些复制开销)