2011-06-15 9 views
112

tengo una API de Java que devuelve una lista como:¿Cómo obtener Scala List de la lista de Java?

public List<?> getByXPath(String xpathExpr) 

estoy usando el código Scala continuación:

val lst = node.getByXPath(xpath) 

Ahora si trato de azúcar sintaxis Scala como:

lst.foreach{ node => ... } 

no funciona. Obtengo el error:

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

Parece que necesito convertir la Lista de Java a la Lista de Scala. ¿Cómo hacer eso en el contexto anterior?

+1

posible duplicado de [la conversión de colección Java en colección Scala] (http://stackoverflow.com/questions/674713/converting-java-collection-into-scala-collection) –

+0

@Kim: no estoy seguro de que sea apropiado cerrar esto como un duplicado de ese pregunta particular: esa pregunta en particular habla de Scala 2.7, y el paquete scala.collection.jcl ya no existe en Scala 2.8 y 2.9. –

Respuesta

156

Desde Scala 2,8 esta conversión está ahora integrado en el idioma mediante:

import scala.collection.JavaConversions._ 

... 

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

obras. asScala no funcionó

+5

¿Puede explicar por qué asScala no funciona? –

+11

En 2.10.4 tuve que importar scala.collection.JavaConverters._ de lo contrario obtuve el "valor porqueScala no es miembro de java.util.List [String]" – dranxo

+6

'JavaConversions' están en desuso desde 2.12.0. Use 'JavaConverters' en su lugar. – Yaroslav

70

Hay un objeto Scala útil sólo para esto - scala.collection.JavaConverters

Usted puede hacer la importación y asScala después de la siguiente manera:

import scala.collection.JavaConverters._ 

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

Esto debe darle la representación de Scala Buffer lo que le permite lograr foreach.

+6

Deben preferirse JavaConverters a JavaConversions, ya que hacen que la conversión sea explícita (y evita las conversiones accidentales que pueden ser confusas). (Es decir, esta es la respuesta correcta) – Mark

7

que estaba buscando una respuesta por escrito en Java y, sorprendentemente, no pudo encontrar ninguna solución a limpiar este lugar. Después de un tiempo pude averiguarlo, así que decidí añadir aquí en caso de que otra persona está buscando la implementación de Java (supongo que también trabaja en Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList() 
5

Si usted tiene que convertir una aplicación Java List<ClassA> a un List[ClassB] Scala, entonces usted debe hacer lo siguiente:

1) Añadir

import scala.collection.JavaConverters._ 

2) utilizar métodos asScala, toList y luego map

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

3) Añadir el siguiente al constructor ClassB que recibe ClassA como un parámetro:

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

desde Scala 2.8.1 usuario JavaConvertest._

Scala y Java colecciones utilizando asScala y como los métodos de Java.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

ver la relación de conversión scala doc site

Cuestiones relacionadas