Comment convertir un scala.List à un java.util.List?
-
19-09-2019 - |
Question
Comment convertir la scala.List
Scala dans la java.util.List
Java?
La solution
Scala Liste et Java Liste sont deux bêtes différentes, parce que le premier est immuable et celle-ci est mutable. Alors, pour aller d'un à l'autre, vous devez d'abord convertir la liste Scala dans une collection mutable.
Le Scala 2.7:
import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))
A partir de Scala 2.8 partir:
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 est pas nécessaire si le type attendu est un List
Java, que la conversion est implicite, comme le démontre la dernière ligne.
Autres conseils
Je ne sais pas pourquoi cela n'a pas été mentionné avant, mais je pense que la façon la plus intuitive est d'appeler la méthode décorateur 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 avons le List
suivant:
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 veulent pas les conversions de contrôle co et laissez faire du compilateur implicite travail 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]
Il vous est à la façon dont vous voulez contrôler votre code.
questions assez vieux, mais je répondrai, étant donné, mais la plupart des suggestions sont déconseillés.
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]
À partir Scala 2.13
, le paquet scala.jdk.CollectionConverters
fournit asJava
via un proxénète de Seq
et remplace les paquets 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 les invocations simples, 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.
faire Tout comme proposé ci-dessus produit la liste immuable même sur le côté Java. La solution de travail que j'ai trouvé est le suivant:
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 a été dépréciée.
Donc, la solution la plus simple pour moi était:
java.util.Arrays.asList("a","b","c")