无法在Scala中迭代Java List

Sri*_*Sri 6 java scala twitter4j

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

我正在调用这个方法

twitter.getFriendsStatuses()
Run Code Online (Sandbox Code Playgroud)

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

我尝试迭代它们,它在第一个元素上进行无限循环:

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

有任何想法吗?

axt*_*avt 26

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

val it = users.iterator
while(it.hasNext() ) {
   println(it.next().getStatus())
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*Hsu 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)
Run Code Online (Sandbox Code Playgroud)


Jör*_*tag 8

什么是错的

users.foreach(user => println(user.getStatus()))
Run Code Online (Sandbox Code Playgroud)

甚至

users.map(_.getStatus()).foreach(println _)
Run Code Online (Sandbox Code Playgroud)

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

users.view.map(_.getStatus()).foreach(println _)
Run Code Online (Sandbox Code Playgroud)

IOW:你为什么要自己管理迭代(并且可能犯错误),当你可以让别人为你做这项工作时?

  • @Srirangan:`import collection.JavaConversions._`它会起作用. (5认同)