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?



@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


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.


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()

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))
   }
}


6

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

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.