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


Answers:


69

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

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


值x:java.util.List [Int]仍然是不可变的。只需在Java中尝试x.add(something)-它将引发错误
Vitamon

1
@Vitamon它对我没有任何错误-我只是对其进行了测试以进行确认。
Daniel C. Sobral

4
scala.collection.JavaConverters从2.12开始弃用
Jeroen Kransen

对于2.12.1,当立即使用Scala for循环遍历Java列表时,我在JavaConverters软件包中使用asScalaBuffer()更好了:scala-lang.org/api/2.12.1/scala/collection/JavaConverters $ .html
莎拉·梅瑟

165

不知道为什么以前没有提到过,但是我认为最直观的方法是直接在Scala列表上调用JavaConvertersasJavadecorator方法:

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]

6
它还要求您是显性的,而不是依赖某些时间可能不需要的隐式魔术。
卡米尔·莱洛内克

如果序列化列表以供以后在Java代码中使用,则会导致问题...导致ClassNotFoundException:scala.collection.convert.Wrappers。Arrays.asList(foo:_ *)在这种情况下有效。
Mohan 2015年

每当我需要在Scala中使用Java时,我都会访问此页面。不幸的是,没有办法向我建议对“ .asJava”的正确建议((
mulya

24

总结以前的答案

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

由您决定如何控制代码。


8

开始Scala 2.13时,包scala.jdk.CollectionConverters提供asJava通过的皮条客Seq,并替换套餐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]

7

虽然我会回答,但给出的答案相当老,但大多数建议已被弃用。

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
祈祷

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]

1

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

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

我没有衡量性能。


0

如上所述,即使在Java方面,这样做也会产生不可变的列表。我找到的唯一可行的解​​决方案是:

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

0

从Scala 2.12.0 开始,不推荐使用JavaConversions。

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

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

1
这个答案没有解释如何使用它来将scala列表转换为java列表。Arrays.asList也可能会出现问题,因为它返回不是可调整大小的List的Arrays.ArrayList,如果您认为自己有util.ArrayList,则可能导致某些意外错误。
puhlen

1
弃用是正确的,有import scala.collection.JavaConverters._2.12.4
祈祷
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.