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

112

Comment convertir Scala scala.Listen Java java.util.List?

Alex Baranosky
la source
3
mec ... changer la réponse acceptée ... (s'il vous plaît)
sfletche

Réponses:

69

La liste Scala et la liste Java 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:

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, asListdans cet exemple, il n'est pas nécessaire si le type attendu est un Java List, car la conversion est implicite, comme le montre la dernière ligne.

Daniel C. Sobral
la source
Le val x: java.util.List [Int] est toujours immuable. Essayez simplement en Java de x.add (quelque chose) - cela
générera une
1
@Vitamon Cela ne génère aucune erreur pour moi - je viens de le tester pour confirmer.
Daniel C. Sobral
4
Obsolète au profit de à scala.collection.JavaConverterspartir de 2.12
Jeroen Kransen
pour 2.12.1, lors d'une itération immédiate sur la liste Java avec une boucle Scala for, j'ai eu plus de chance avec asScalaBuffer () dans le package JavaConverters
Sarah Messer
165

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 asJavaméthode décoratrice 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]
dimitrisli
la source
6
Cela nécessite également que vous soyez explicite plutôt que de dépendre d'une magie implicite qui pourrait être indésirable un certain temps.
Kamil Lelonek
Cela pose des problèmes si la sérialisation de la liste pour une utilisation ultérieure dans le code Java ... cela entraîne une exception ClassNotFoundException: scala.collection.convert.Wrappers. Arrays.asList (foo: _ *) fonctionne dans ce cas.
Mohan
Je viens sur cette page chaque fois que j'ai besoin d'utiliser Java dans Scala. Malheureusement, il n'y a aucun moyen de me suggérer une suggestion d'importation appropriée pour ".asJava" ((
mulya
24

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

En supposant que nous avons les éléments suivants List:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

Si tu veux etre 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 co-contrôler les conversions et laissez le compilateur faire un travail implicite 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 souhaitez contrôler votre code.

Kamil Lelonek
la source
8

En commençant Scala 2.13, le package scala.jdk.CollectionConvertersfournit asJavavia un souteneur Seqet 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]
Xavier Guihot
la source
7

Jolies questions anciennes, je vais y répondre, mais la plupart des suggestions sont obsolètes.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
Shirish Kumar
la source
object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
prier le
5

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]
Guillaume Massé
la source
1

Pour les appels simples, le faire à la main peut ê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.

Stefan W.
la source
0

Le simple fait de faire comme proposé ci-dessus produit une liste immuable même du côté Java. La seule solution de travail 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
 }
Vitamon
la source
0

Depuis Scala 2.12.0 JavaConversions est obsolète.

La solution la plus simple pour moi était donc:

java.util.Arrays.asList("a","b","c")
elarib
la source
1
Cette réponse n'explique pas comment l'utiliser pour convertir une liste scala en une liste java. Arrays.asList peut également être problématique car il renvoie un Arrays.ArrayList qui n'est pas une liste redimensionnable qui peut provoquer des erreurs inattendues si vous pensez avoir un util.ArrayList.
puhlen
1
La dépréciation est vraie, il y a import scala.collection.JavaConverters._pour 2.12.4
prier le