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

时间:2010-03-12 01:37:18

标签: java scala scala-java-interop

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

9 个答案:

答案 0 :(得分:146)

不确定为什么以前没有提到这个,但我认为最直观的方法是直接在Scala列表上调用JavaConvertersasJava装饰器方法:

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]

答案 1 :(得分:66)

Scala List和Java List是两种不同的野兽,因为前者是不可变的而后者是可变的。因此,要从一个到另一个,首先必须将Scala列表转换为可变集合。

在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 asList,则该示例中不需要List,因为转换是隐式的,如最后一行所示。

答案 2 :(得分:21)

总结以前的答案

假设我们有以下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]

由您决定如何控制代码。

答案 3 :(得分:6)

相当古老的问题,虽然我会回答,但是大多数建议都被弃用了。

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

答案 4 :(得分:5)

<强>更新

使用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]

答案 5 :(得分:2)

Scala 2.13开始,软件包scala.jdk.CollectionConverters通过Seq的皮条客提供asJava并替换软件包scala.collection.JavaConverters/JavaConversions

import scala.jdk.CollectionConverters.Ops._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]

答案 6 :(得分:1)

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

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

我没有衡量表现。

答案 7 :(得分:0)

正如上面提到的那样,即使在Java端也会生成不可变列表。 我发现的唯一可行的解​​决方案是:

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

答案 8 :(得分:-2)

自Scala 2.12.0 JavaConversions has been deprecated.

以来

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

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