Comment convertir Scala scala.List
En Java Java.util.List
?
Scala List et Java List sont deux bêtes différentes, car la première est immuable et la dernière est modifiable. Donc, pour aller de l’une à l’autre, vous devez d’abord convertir le Scala Liste dans une collection mutable.
On Scala 2.7:
import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))
À partir de Scala 2.8 et plus:
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): _*)
Cependant, asList
dans cet exemple n'est pas nécessaire si le type attendu est Java List
, car la conversion est implicite, comme le montre la dernière ligne.
Je ne sais pas pourquoi cela n’a pas été mentionné auparavant, mais je pense que le moyen le plus intuitif est d’appeler la méthode de décorateur asJava
de JavaConverters directement sur le Scala = liste:
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]
En supposant que nous ayons ce qui suit List
:
scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
Si vous voulez être explicite et dire exactement ce que vous voulez convertir:
scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._
scala> scalaList.asJava
res11: Java.util.List[Int] = [1, 2, 3]
Si vous ne voulez pas contrôler les conversions et laissez le compilateur faire implicitement travailler pour vous:
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]
C'est à vous de décider comment vous voulez contrôler votre code.
Assez vieilles questions, bien que je vais y répondre, étant donné, mais la plupart des suggestions sont déconseillées.
import scala.collection.JavaConversions.seqAsJavaList
val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
Mise à jour
avec scala 2.9.2:
import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: Java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )
résultat
[1, 2, 3]
Commencer Scala 2.13
, le paquet scala.jdk.CollectionConverters
fournit asJava
via un proxénète de Seq
et remplace les packages 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]
Pour des invocations uniques, le faire à la main pourrait être la solution la plus simple:
val slist = List (1, 2, 3, 4)
val jl = new Java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))
Je n'ai pas mesuré la performance.
Effectuer ce qui est proposé ci-dessus produit une liste immuable, même du côté Java. La seule solution efficace que j'ai trouvée est la suivante:
def toJList[T](l:List[T]):util.List[T] = {
val a = new util.ArrayList[T]
l.map(a.add(_))
a
}