web-dev-qa-db-fra.com

Comment obtenir Scala List from Java List?)?

J'ai une API Java qui renvoie une liste comme celle-ci:

public List<?> getByXPath(String xpathExpr)

J'utilise le code ci-dessous scala:

val lst = node.getByXPath(xpath)

Maintenant, si j'essaie scala sucre comme syntaxe:

lst.foreach{ node => ... }

ça ne marche pas. Je reçois l'erreur:

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

Il semble que j'ai besoin de convertir Java List to Scala List. Comment faire cela dans le contexte ci-dessus?)?

127
ace

EDIT: Notez que ceci est obsolète depuis 2.12.0. Utilisez JavaConverters à la place. (commentaire de @Yaroslav)

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

import scala.collection.JavaConversions._

...

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

travaux. asScala n'a pas fonctionné

169
ace

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

Vous pouvez ensuite importer et asScala comme suit:

import scala.collection.JavaConverters._

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

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

87
montreal.eric

Si vous devez convertir un Java List<ClassA> à a Scala List[ClassB], vous devez alors:

1) Ajouter

import scala.collection.JavaConverters._

2) Utilisez les méthodes asScala, toList puis map

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

3) Ajoutez ce qui suit au constructeur ClassB qui reçoit ClassA en tant que paramètre:

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

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, j’ai donc décidé de l’ajouter ici au cas où quelqu'un d’autre cherche l’implémentation Java (je suppose que cela fonctionne aussi en Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()
8
Radix

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

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

voir la relation de conversion site scala doc

6
user1553728