2010-07-20 19 views
7

En mi función Scala, estoy atravesando Java ArrayCollection, extrayendo elementos específicos que deberían formar una nueva colección. Al final, tiene que ser una Java-ArrayList nuevamente, porque estoy interactuando con un Framework de Java. Mi Código:Convertir un Scala Buffer a Java ArrayList

// to make scala-style iterating over arraylist possible 
import scala.collection.JavaConversions._ 

// ArrayList contains elements of this type: 
class Subscription(val subscriber:User, val sender:User) 

// I'm getting this list from Java: 
val jArrayList = new ArrayList[Subscription] 
// Buffer:scala.collection.mutable.Buffer[User] 
val buffer = for (val subscription <- jArrayList) yield subscription.sender 

¿Cómo puedo convertir el búfer a un ArrayList [usuario]? ¿O no debería usar el rendimiento aquí?

Respuesta

7

Usted debe ser capaz de convertir de nuevo especificando qué tipo desea buffer a ser (JavaConversions deben ser puestos en juego de forma automática cuando el tipo se estamos tratando de conseguir y el que tienes son incompatibles):

val buffer: java.util.List[User] = 
    for (val subscription <- jArrayList) yield subscription.sender 

alternativa, se puede llamar a la conversión de JavaConversions explícitamente si desea dejar en claro lo que está haciendo:

val buffer = asList(for (...)) // buffer should have type "java.util.List[User]" 

Ninguno de estos realmente produce un ArrayList; más bien, crean un genérico List, pero en general es una mala práctica especificar tipos de colección directamente. Si debe tener un ArrayList, pasar su List al constructor de ArrayList que toma un Collection:

new ArrayList(buffer) 
2

Usted podría pasar el búfer en el constructor ArrayList para crear un nuevo ArrayList de Java:

var newArray = new ArrayList[Int] (buffer) 
+1

Esto probablemente trabajar debido al hecho de que éste se convertirá implícitamente a un java.util.List. Cosas buenas, aunque a veces realmente no necesitas una ArrayList en lugar de solo una Lista. – Calum

1

Cuando uno utiliza para comprensiones, el código subyacente utiliza map, flatMap, foreach, filter o withFilter - Relacionados preguntas En este ejemplo en particular, ese código sería equivalente a jArrayList.map(_.sender), y map produce nuevas colecciones (estoy ignorando la conversión implícita aquí para mantenerlo simple).

Lo que sucede aquí que quizás sea poco intuitivo, y quizás podría mejorarse, es que ArrayList no implementa map. La conversión implícita le da un Buffer en su lugar, y un map en un Buffer devuelve un Buffer.

concedido, Buffer en JavaConversions conserva la colección subyacente, ArrayList, como la tienda de respaldo. El recién creado Buffer, por otro lado, no se basará en eso, sino en una de las colecciones propias de Scala.

Siempre se puede hacer esto, sin embargo:

val buffer = (for (val subscription <- jArrayList) yield subscription.sender).asList 
Cuestiones relacionadas