Comment obtenir la liste Scala à partir de la liste Java?


133

J'ai une API Java qui renvoie une liste comme:

public List<?> getByXPath(String xpathExpr)

J'utilise le code scala ci-dessous:

val lst = node.getByXPath(xpath)

Maintenant, si j'essaye le sucre de syntaxe scala comme:

lst.foreach{ node => ... }

ça ne marche pas. J'obtiens l'erreur:

value foreach is not a member of java.util.List[?0]

Il semble que j'ai besoin de convertir la liste Java en liste Scala. Comment faire cela dans le contexte ci-dessus?



@Kim: Je ne suis pas sûr qu'il soit approprié de fermer ceci comme un double de cette question particulière - cette question particulière parle de Scala 2.7, et le paquet scala.collection.jcl n'existe plus dans Scala 2.8 et 2.9.
Ken Bloom du

Réponses:


177

EDIT: Notez que cela est obsolète depuis la 2.12.0. Utilisez JavaConvertersplutôt. (commentaire de @Yaroslav)

Depuis Scala 2.8, cette conversion est désormais intégrée au langage en utilisant:

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

travaux. asScalan'a pas marché


13
Le 2.10.4, j'ai dû importer scala.collection.JavaConverters._ sinon j'ai obtenu "value asScala n'est pas membre de java.util.List [String]"
dranxo

11
JavaConversionssont obsolètes depuis la 2.12.0. Utilisez JavaConvertersplutôt.
Yaroslav

4
Pour la 2.13.x, vous avez besoin de import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou

92

Il existe un objet Scala pratique juste pour cela - scala.collection.JavaConverters

Vous pouvez faire l'importation et asScalaensuite comme suit:

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

Cela devrait vous donner la Bufferreprésentation de Scala vous permettant d'accomplir foreach.


7
Les JavaConverters doivent être préférés aux JavaConversions car ils rendent la conversion explicite (et évite les conversions accidentelles qui peuvent prêter à confusion). (Ie, c'est la bonne réponse)
Mark

depuis scala 2.13, cette classe est également obsolète. Utilisez plutôt scala.jdk.CollectionConverters.
dev-null

9

Je cherchais une réponse écrite en Java et étonnamment je n'ai trouvé aucune solution propre ici. Après un certain temps, j'ai pu le comprendre, alors j'ai décidé de l'ajouter ici au cas où quelqu'un d'autre chercherait l'implémentation Java (je suppose que cela fonctionne également dans Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

Si vous devez convertir un Java List<ClassA>en Scala List[ClassB], vous devez effectuer les opérations suivantes:

1) Ajouter

import scala.collection.JavaConverters._

2) Utilisez des méthodes asScala, toListpuismap

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))

3) Ajoutez ce qui suit au ClassBconstructeur qui reçoit ClassAcomme paramètre:

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}

6

Depuis scala 2.8.1, utilisez JavaConverters._ pour convertir les collections scala et Java en utilisant les méthodes asScala et asJava.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

voir le site de documentation Scala Relation de conversion


6

Raccourci pour convertir la liste java en liste scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

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.