如何将Scala的scala.List
转换为Java的java.util.List
?
如何将Scala的scala.List
转换为Java的java.util.List
?
不确定为什么之前没有提到过,但我认为最直观的方法是直接在Scala列表上调用asJava
修饰器方法,该方法位于JavaConverters中。
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的List和Java的List是两个不同的东西,前者是不可变的,后者是可变的。因此,要从一个转换为另一个,你首先需要将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): _*)
然而,在该示例中,如果期望的类型是Java List
,则asList
不是必需的,因为转换是隐式的,就像最后一行所示。
scala.collection.JavaConverters
代替此方法。 - Jeroen Kransen假设我们有如下的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]
你可以自己决定如何控制你的代码。
从 Scala 2.13
开始,scala.jdk.CollectionConverters
包通过 Seq
的增强转换提供了 asJava
方法,替代了原来的包 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]
虽然这些问题有点老,但我会回答。不过大部分建议都已经过时了。
import scala.collection.JavaConversions.seqAsJavaList
val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
- prayagupa更新
使用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]
对于单次调用,手动操作可能是最简单的解决方案:
val slist = List (1, 2, 3, 4)
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))
我没有测量性能。
按照上面提出的方法进行操作,即使在Java端也会生成不可变列表。 我找到的唯一有效的解决方案是:
def toJList[T](l:List[T]):util.List[T] = {
val a = new util.ArrayList[T]
l.map(a.add(_))
a
}
import scala.collection.JavaConverters._
。 - prayagupascala.jdk.CollectionConverters._
的asJava
是我认为的正确方式。 - jaecktec