我在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())
}
有什么想法吗?
答案 0 :(得分:26)
我猜users.iterator
每次评估时都会产生新的迭代器。试试这个:
val it = users.iterator
while(it.hasNext() ) {
println(it.next().getStatus())
}
答案 1 :(得分:17)
如果您使用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)
答案 2 :(得分:8)
只是
有什么问题users.foreach(user => println(user.getStatus()))
甚至
users.map(_.getStatus()).foreach(println _)
或者,如果您担心两次遍历集合
users.view.map(_.getStatus()).foreach(println _)
IOW:你为什么要自己管理迭代(并且可能犯错误),当你可以让别人为你做这项工作时?
答案 3 :(得分:3)
我更喜欢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)
答案 4 :(得分:1)
我建议使用
scala.collection.JavaConverters._
并简单地将.asScala
添加到您要迭代的每个对象