如何将 Scala 的 scala.List转换成 Java 的 java.util.List?
scala.List
java.util.List
Scala List 和 JavaList 是两个不同的概念,因为前者是不可变的,而后者是可变的。因此,要从一个集合转换到另一个集合,首先必须将 Scala List 转换为一个可变集合。
在 Scala 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): _*)
但是,如果所期望的类型是 JavaList,则该示例中的 asList不是必需的,因为转换是隐式的,如最后一行所示。
List
asList
对于单个调用,手工完成可能是最简单的解决方案:
val slist = List (1, 2, 3, 4) val jl = new java.util.ArrayList [Integer] (slist.size) slist.foreach (jl.add (_))
我没有衡量绩效。
更新
使用 scala 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]
就像上面提到的那样,即使在 Java 端也会产生不可变的列表。 我找到的唯一可行的解决办法是:
def toJList[T](l:List[T]):util.List[T] = { val a = new util.ArrayList[T] l.map(a.add(_)) a }
我不知道为什么之前没有提到这一点,但我认为最直观的方法是直接在 Scala 列表中调用 JavaConverters的 asJava装饰器方法:
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]
如何控制代码取决于您自己。
很老的问题,虽然我会回答,给出,但大多数建议是反对的。
import scala.collection.JavaConversions.seqAsJavaList val myList = List("a", "b", "c") val myListAsJavaList = seqAsJavaList[String](myList)
从 Scala 2.12.0 已经不推荐使用 JavaConversion。开始
所以对我来说最简单的解决办法是:
java.util.Arrays.asList("a","b","c")
从 Scala 2.13开始,包 scala.jdk.CollectionConverters通过一个 Seq的皮条客提供 asJava,并取代包 scala.collection.JavaConverters/JavaConversions:
Scala 2.13
scala.jdk.CollectionConverters
Seq
scala.collection.JavaConverters/JavaConversions
import scala.jdk.CollectionConverters._ // val scalaList: List[Int] = List(1, 2, 3) scalaList.asJava // java.util.List[Int] = [1, 2, 3]