126

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

4

9 回答 9

179

不知道为什么之前没有提到这一点,但我认为最直观的方法是直接在 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]
于 2013-12-29T00:14:55.267 回答
69

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): _*)

但是,asList如果预期的类型是 Java,则在该示例中不是必需的List,因为转换是隐式的,如最后一行所示。

于 2010-03-12T04:30:08.600 回答
25

总结前面的答案

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

如果您不想要 co 控制转换并让编译器为您进行隐式工作:

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]

如何控制代码取决于您。

于 2014-11-28T12:01:59.617 回答
14

开始Scala 2.13,该包通过一个 pimp 提供scala.jdk.CollectionConverters并替换包:asJavaSeqscala.collection.JavaConverters/JavaConversions

import scala.jdk.CollectionConverters._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]
于 2019-03-31T20:01:33.720 回答
7

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

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
于 2017-01-20T00:31:46.967 回答
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]
于 2012-07-15T03:18:31.433 回答
1

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

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

我没有衡量性能。

于 2010-03-12T13:53:08.430 回答
0

即使在 Java 端,只要按照上面的建议进行操作就会产生不可变列表。我发现的唯一可行的解​​决方案是:

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }
于 2013-05-08T12:51:34.330 回答
0

自 Scala 2.12.0 以来,JavaConversions 已被弃用。

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

java.util.Arrays.asList("a","b","c")
于 2017-06-01T13:48:37.720 回答