Wie bekomme ich Scala List von Java List?

133

Ich habe eine Java-API, die eine Liste zurückgibt wie:

public List<?> getByXPath(String xpathExpr)

Ich verwende den folgenden Scala-Code:

val lst = node.getByXPath(xpath)

Nun, wenn ich Scala Syntax Zucker versuche wie:

lst.foreach{ node => ... }

es funktioniert nicht. Ich bekomme den Fehler:

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

Es scheint, dass ich Java List in Scala List konvertieren muss. Wie geht das im obigen Kontext?

As
quelle
2
Mögliches Duplikat der Konvertierung der Java-Sammlung in die Scala-Sammlung
Kim Stebel
@Kim: Ich bin nicht sicher, ob es angemessen ist, dies als Duplikat dieser bestimmten Frage zu schließen - diese bestimmte Frage bezieht sich auf Scala 2.7, und das Paket scala.collection.jcl existiert in Scala 2.8 und 2.9 nicht mehr.
Ken Bloom

Antworten:

177

BEARBEITEN: Beachten Sie, dass dies seit 2.12.0 veraltet ist. Verwenden Sie JavaConvertersstattdessen. (Kommentar von @Yaroslav)

Seit Scala 2.8 ist diese Konvertierung nun in die Sprache integriert mit:

import scala.collection.JavaConversions._

...

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

funktioniert. asScalafunktioniert nicht

As
quelle
13
Am 2.10.4 musste ich scala.collection.JavaConverters._ importieren, sonst bekam ich "value asScala ist kein Mitglied von java.util.List [String]"
dranxo
11
JavaConversionssind seit 2.12.0 veraltet. Verwenden Sie JavaConvertersstattdessen.
Jaroslaw
4
Für 2.13.x benötigen Sie import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou
92

Dafür gibt es ein praktisches Scala-Objekt - scala.collection.JavaConverters

Sie können den Import und asScaladanach wie folgt durchführen:

import scala.collection.JavaConverters._

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

Dies sollte Ihnen Scalas BufferDarstellung geben, die es Ihnen ermöglicht, dies zu erreichen foreach.

montreal.eric
quelle
7
JavaConverters sollten JavaConversions vorgezogen werden, da dadurch die Konvertierung explizit gemacht wird (und versehentliche Konvertierungen vermieden werden, die verwirrend sein können). (Dh, ist dies die richtige Antwort)
Mark
seit scala 2.13 ist auch diese klasse veraltet. Verwenden Sie stattdessen scala.jdk.CollectionConverters.
dev-null
9

Ich suchte nach einer in Java geschriebenen Antwort und konnte hier überraschenderweise keine sauberen Lösungen finden. Nach einer Weile konnte ich es herausfinden und entschied mich, es hier hinzuzufügen, falls jemand anderes nach der Java-Implementierung sucht (ich denke, es funktioniert auch in Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()
Radix
quelle
9

Wenn Sie ein Java List<ClassA>in eine Scala konvertieren List[ClassB]müssen, müssen Sie Folgendes tun:

1) Hinzufügen

import scala.collection.JavaConverters._

2) Verwendung Methoden asScala, toListund dannmap

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

3) Fügen Sie dem ClassBKonstruktor, der ClassAals Parameter empfängt, Folgendes hinzu :

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

Seit scala 2.8.1 JavaConverters._ werden Scala- und Java-Sammlungen mit den Methoden asScala und asJava konvertiert.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

Weitere Informationen finden Sie auf der Scala-Dokumentenseite für Conversion-Beziehungen

user1553728
quelle
6

Verknüpfung zum Konvertieren der Java-Liste in die Scala-Liste

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Xing-Wei Lin
quelle