web-dev-qa-db-fra.com

Comment convertir une scala.List en une Java.util.List?

Comment convertir Scala scala.List En Java Java.util.List?

103
Alex Baranosky

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.

66
Daniel C. Sobral

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]
151
dimitrisli

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

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.

22
Kamil Lelonek

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)
6
Shirish Kumar

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]
5
Guillaume Massé

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]
4
Xavier Guihot

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.

1
Stefan W.

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
 }
0
Vitamon