6

我在 Scala 项目中使用 Java Twitter4J 库。

我正在调用方法

twitter.getFriendsStatuses()

此方法返回包含状态的 twitter4j.User 对象列表。

我尝试遍历它们,它在第一个元素上无限循环:

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

有任何想法吗?

4

5 回答 5

27

我猜users.iterator每次评估都会产生新的迭代器。尝试这个:

val it = users.iterator
while(it.hasNext() ) {
   println(it.next().getStatus())
}
于 2011-03-14T13:38:36.547 回答
18

如果您使用 Scala 2.8,您可以使用 JavaConversion 将 Java 集合自动转换为 Scala 集合。

前任。

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)
于 2011-03-14T15:21:05.867 回答
8

只是有什么问题

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

甚至

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

或者,如果您担心两次遍历集合

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

IOW:当您可以让其他人为您完成工作时,您为什么要自己管理迭代(并且可能会犯错误)?

于 2011-03-14T14:14:50.927 回答
4

我更喜欢 scalaj-collection 到 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

于 2011-03-14T16:11:27.797 回答
1

我建议使用

scala.collection.JavaConverters._

并简单地添加.asScala到您希望迭代的每个对象

于 2014-12-11T11:15:38.217 回答