Come ottenere la Scala List dalla Java List?


133

Ho un'API Java che restituisce un elenco come:

public List<?> getByXPath(String xpathExpr)

Sto usando il seguente codice scala:

val lst = node.getByXPath(xpath)

Ora se provo lo zucchero sintassi scala come:

lst.foreach{ node => ... }

non funziona. Ottengo l'errore:

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

Sembra che debba convertire Java List in Scala List. Come farlo nel contesto sopra?



@Kim: Non sono sicuro che sia opportuno chiuderlo come duplicato di quella particolare domanda - quella particolare domanda parla di Scala 2.7, e il pacchetto scala.collection.jcl non esiste più in Scala 2.8 e 2.9.
Ken Bloom,

Risposte:


177

EDIT: si noti che questo è obsoleto dalla 2.12.0. Usa JavaConvertersinvece. (commento di @Yaroslav)

Da Scala 2.8 questa conversione è ora integrata nella lingua usando:

import scala.collection.JavaConversions._

...

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

lavori. asScalanon ha funzionato


13
Il 2.10.4 ho dovuto importare scala.collection.JavaConverters._ altrimenti ho ottenuto "valore asScala non è un membro di java.util.List [String]"
dranxo,

11
JavaConversionssono obsoleti dal 2.12.0. Usa JavaConvertersinvece.
Yaroslav,

4
Per 2.13.x, hai bisogno di import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou

92

C'è un pratico oggetto Scala proprio per questo: scala.collection.JavaConverters

È possibile eseguire l'importazione e asScalasuccessivamente come segue:

import scala.collection.JavaConverters._

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

Questo dovrebbe darti la Bufferrappresentazione di Scala che ti permette di realizzare foreach.


7
JavaConverters dovrebbe essere preferito a JavaConversions poiché rende esplicita la conversione (ed evita conversioni accidentali che potrebbero creare confusione). (Cioè, questa è la risposta corretta)
Segna il

da scala 2.13 anche questa classe è obsoleta. Utilizzare invece scala.jdk.CollectionConverters.
dev-null,

9

Stavo cercando una risposta scritta in Java e sorprendentemente non sono riuscito a trovare soluzioni pulite qui. Dopo un po 'sono stato in grado di capirlo, quindi ho deciso di aggiungerlo qui nel caso in cui qualcun altro stia cercando l'implementazione Java (suppongo che funzioni anche in Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

Se devi convertire un Java List<ClassA>in un Scala List[ClassB], devi fare quanto segue:

1) Aggiungi

import scala.collection.JavaConverters._

2) Utilizzare i metodi asScala, toListquindimap

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

3) Aggiungere quanto segue al ClassBcostruttore che riceve ClassAcome parametro:

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

6

Da scala 2.8.1 utilizzare JavaConverters._ per convertire le raccolte scala e Java utilizzando i metodi asScala e asJava.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

consultare il sito scala doc relazione di conversione


6

Scorciatoia per convertire la lista java in scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.