无法在Scala中迭代Java List

时间:2011-03-14 13:36:35

标签: java scala twitter4j

我在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())
}

有什么想法吗?

5 个答案:

答案 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)

此处可用:https://github.com/scalaj/scalaj-collection

答案 4 :(得分:1)

我建议使用

scala.collection.JavaConverters._

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