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


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.


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]

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.


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]

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)

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]

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.


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
 }

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")

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.