如何将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")