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?

as
la source
2
duplicata possible de Conversion de la collection Java en collection Scala
Kim Stebel
@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é

as
la source
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.

montreal.eric
la source
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()
Base
la source
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))
   }
}
Leandro Carrasco
la source
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

user1553728
la source
6

Raccourci pour convertir la liste java en liste scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Xing-Wei Lin
la source