Comment convertir une liste scala.List en java.util.List?

Comment convertir la scala.List de Scala en java.util.List de Java?

Scala List et Java List sont deux bêtes différentes, car la première est immuable et la seconde est mutable. Donc, pour passer de l’un à l’autre, vous devez d’abord convertir la liste Scala en une collection mutable.

Sur 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 suivantes:

 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 une List Java, 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’invoquer la méthode de décoration asJava de JavaConverters directement sur la liste Scala:

 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] 

Pour résumer les réponses précédentes

En supposant que nous ayons la List suivante:

 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 souhaitez pas contrôler les conversions et laisser le compilateur travailler implicitement 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 contrôler votre code.

Mettre à 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] 

Assez vieilles questions, même si je vais répondre, mais la plupart des suggestions sont déconseillées.

 import scala.collection.JavaConversions.seqAsJavaList val myList = List("a", "b", "c") val myListAsJavaList = seqAsJavaList[Ssortingng](myList) 

Pour les 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é les performances.

Faire juste comme proposé ci-dessus produit une liste immuable même du côté de Java. La seule solution 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 } 

Depuis Scala 2.12.0, JavaConversions est obsolète.

Donc, la solution la plus simple pour moi était:

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