2011-03-14 20 views
5

Estoy usando la biblioteca Java Twitter4J en un proyecto de Scala.No se puede iterar Lista de Java en Scala

Voy a llamar al método

twitter.getFriendsStatuses() 

Este método devuelve una lista de objetos que contienen twitter4j.User estados.

Trato de iterar sobre ellos y que va en un bucle infinito sobre el primer elemento:

val users:List[User] = twitter.getFriendsStatuses(userId, paging.getSinceId()) 
while(users.iterator.hasNext()) { 
    println(users.iterator.next().getStatus()) 
} 

¿Alguna idea?

Respuesta

24

Supongo que users.iterator produce el nuevo iterador cada vez que se evalúa. Prueba esto:

val it = users.iterator 
while(it.hasNext()) { 
    println(it.next().getStatus()) 
} 
+0

Gracias. ¡Por qué no pensé en eso! :-) – Sri

8

¿Qué pasa con sólo

o incluso

users.map(_.getStatus()).foreach(println _) 

o, si usted está preocupado por que atraviesa la colección dos veces

users.view.map(_.getStatus()).foreach(println _) 

OIA : ¿Por qué quieres administrar la iteración tú? f (y posiblemente cometer errores), cuando puede dejar que otra persona haga el trabajo por usted?

+0

+1 para agregar el uso de 'view' – gpampara

+0

No pasa nada. Acabo de comenzar a aprender Scala. Gracias por los ejemplos! PD: Estas son listas de Java, verificará si tus ejemplos funcionan. – Sri

+0

No, lo siento. Twitter4J me devuelve java.util.List y .foreach, .map, .view.map no funcionan de la caja. ¿Hay alguna manera ordenada de convertir estos en listas de Scala y hacer uso de .foreach, .map y .view? – Sri

17

Si usa Scala 2.8, puede usar JavaConversion para convertir la colección de Java a la colección de Scala automáticamente.

Ej.

import scala.collection.JavaConversions._ 

// Java Collection 
val arrayList = new java.util.ArrayList[Int] 
arrayList.add(2) 
arrayList.add(3) 
arrayList.add(4) 

// It will implicitly covert to Scala collection, 
// so you could use map/foreach...etc. 
arrayList.map(_ * 2).foreach(println) 
3

Prefiero scalaj-collection a scala.collection.JavaConversions. Esto hace que las conversiones explícitas:

import scalaj.collection.Implicits._ 

val arrayList = new java.util.ArrayList[Int] 
arrayList.add(2) 
arrayList.add(3) 
arrayList.add(4) 

arrayList.asScala.map(_ * 2).foreach(println) 

Disponible aquí: https://github.com/scalaj/scalaj-collection

+1

No sabía acerca de scalaj-collection, pero en Scala 2.8, al menos, 'import scala.collection.JavaConverters._' le dará conversiones' .asScala' explícitas si lo desea. –

+0

Sí, había oído hablar de eso, pero no he tenido el tiempo para investigar realmente la implementación de JavaConverters. scalaj-collection está bastante limpio, así que me he quedado pegado a eso. –

1

sugiere emplear

scala.collection.JavaConverters._

y simplemente añadir .asScala a todos los objetos que va a recorrer

Cuestiones relacionadas