【发布时间】:2011-01-26 15:52:02
【问题描述】:
如何将Scala的scala.List转换成Java的java.util.List?
【问题讨论】:
-
老兄...更改接受的答案...(请)
标签: java scala scala-java-interop
如何将Scala的scala.List转换成Java的java.util.List?
【问题讨论】:
标签: java scala scala-java-interop
不知道为什么之前没有提到这一点,但我认为最直观的方法是直接在 Scala 列表中调用 JavaConverters 的 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]
【讨论】:
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
假设我们有以下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
更新
使用 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
}
【讨论】:
自 Scala 2.12.0 JavaConversions has been deprecated.
所以对我来说最简单的解决方案是:
java.util.Arrays.asList("a","b","c")
【讨论】:
import scala.collection.JavaConverters._