Невозможно повторить список Java в Scala - PullRequest
6 голосов
/ 14 марта 2011

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

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

twitter.getFriendsStatuses()

Этот метод возвращает список объектов twitter4j.User, содержащих статусы.

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

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

Есть идеи?

Ответы [ 5 ]

26 голосов
/ 14 марта 2011

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

val it = users.iterator
while(it.hasNext() ) {
   println(it.next().getStatus())
}
17 голосов
/ 14 марта 2011

Если вы используете 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)
8 голосов
/ 14 марта 2011

Что не так с просто

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

или даже

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

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

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

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

3 голосов
/ 14 марта 2011

Я предпочитаю scalaj-коллекцию scala.collection.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

1 голос
/ 11 декабря 2014

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

scala.collection.JavaConverters._

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

...