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?)?
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é
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
.
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))
}
}
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()
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