如何将scala.List转换为java.util.List?

如何将Scala的scala.List转换成Java的java.util.List

Scala List和Java List是两个不同的怪物,因为前者是不可变的,后者是可变的。 所以,从一个到另一个,你首先必须将Scala List转换为一个可变的集合。

在斯卡拉2.7:

 import scala.collection.jcl.Conversions.unconvertList import scala.collection.jcl.ArrayList unconvertList(new ArrayList ++ List(1,2,3)) 

从Scala 2.8开始:

 import scala.collection.JavaConversions._ import scala.collection.mutable.ListBuffer asList(ListBuffer(List(1,2,3): _*)) val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*) 

但是,如果期望的types是Java List ,则该示例中的asList不是必需的,因为转换是隐式的,如最后一行所示。

不知道为什么这之前没有提到过,但我认为最直观的方法是直接在Scala列表中调用asJava装饰器方法:

 scala> val scalaList = List(1,2,3) scalaList: List[Int] = List(1, 2, 3) scala> import scala.collection.JavaConverters._ import scala.collection.JavaConverters._ scala> scalaList.asJava res11: java.util.List[Int] = [1, 2, 3] 

总结以前的答案

假设我们有以下List

 scala> val scalaList = List(1,2,3) scalaList: List[Int] = List(1, 2, 3) 

如果你想明确地 告诉你想要转换的内容:

 scala> import scala.collection.JavaConverters._ import scala.collection.JavaConverters._ scala> scalaList.asJava res11: java.util.List[Int] = [1, 2, 3] 

如果您不希望共同控制转换,并让编译器为您做隐式工作:

 scala> import scala.collection.JavaConversions._ import scala.collection.JavaConversions._ scala> val javaList: java.util.List[Int] = scalaList javaList: java.util.List[Int] = [1, 2, 3] 

这取决于你如何控制你的代码。

更新

与斯卡拉2.9.2:

 import scala.collection.JavaConversions._ import scala.collection.mutable.ListBuffer val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* ) 

结果

 [1, 2, 3] 

很老的问题,虽然我会回答,但大部分build议都被弃用。

 import scala.collection.JavaConversions.seqAsJavaList val myList = List("a", "b", "c") val myListAsJavaList = seqAsJavaList[String](myList) 

对于单个调用,手动执行可能是最简单的解决scheme:

 val slist = List (1, 2, 3, 4) val jl = new java.util.ArrayList [Integer] (slist.size) slist.foreach (jl.add (_)) 

我没有衡量performance。

就像上面提出的那样,即使在Java端也会产生不可变的列表。 我发现唯一的工作解决scheme是这样的:

 def toJList[T](l:List[T]):util.List[T] = { val a = new util.ArrayList[T] l.map(a.add(_)) a } 

由于Scala 2.12.0 JavaConversions已被弃用。

所以对我来说最简单的解决scheme是:

 java.util.Arrays.asList("a","b","c")