Невозможно выполнить итерацию списка Java в Scala

Я использую библиотеку Java Twitter4J в проекте Scala.

Я вызываю метод

twitter.getFriendsStatuses()

этот метод возвращает список twitter4j.Пользовательские объекты, содержащие статусы.

Я пытаюсь перебрать их, и он идет в бесконечном цикле над первым элементом:

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

какие идеи?

5 ответов


Я думаю users.iterator создает новый итератор каждый раз это оценили. Попробуйте это:

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

Если вы используете Scala 2.8, вы можете использовать JavaConversion для автоматического преобразования коллекции Java в коллекцию Scala.

Ex.

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)

Что случилось с just

users.foreach(user => println(user.getStatus()))

или даже

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

или, если вы беспокоитесь о пересечении коллекции дважды

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

IOW: почему вы хотите управлять итерацией самостоятельно (и, возможно, совершать ошибки), когда вы можете просто позволить кому-то другому делать работу за вас?


Я предпочитаю scalaj-collection scala.коллекция.JavaConversions. Это делает преобразования явными:

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)

здесь: https://github.com/scalaj/scalaj-collection


Я предлагаю использовать

scala.collection.JavaConverters._

и просто добавить .asScala для каждого объекта, который вы хотите перебрать