繁体   English   中英

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

[英]How to convert a scala.List to a java.util.List?

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

不知道为什么这次却没有被提及过,但我觉得最直观的方法是调用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列表转换为可变集合。

在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不是必需的,因为转换是隐式的,如最后一行所示。

总结以前的答案

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

由您决定如何控制代码取决于您自己。

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

import scala.collection.JavaConversions.seqAsJavaList

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

更新

与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]

启动Scala 2.13 ,包scala.jdk.CollectionConverters通过pimp的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]

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

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已被弃用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM