无法在 Scala 中迭代 Java 列表

发布于 2024-10-22 00:20:12 字数 384 浏览 1 评论 0原文

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

有什么想法吗?

I'm using the Java Twitter4J library in a Scala project.

I'm calling the method

twitter.getFriendsStatuses()

This method returns a list of twitter4j.User objects containing statuses.

I try to iterate over them and it goes in an infinite loop over the first element:

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

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

触ぅ动初心 2024-10-29 00:20:12

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

val it = users.iterator
while(it.hasNext() ) {
   println(it.next().getStatus())
}

I guess users.iterator produces the new iterator each time it's evaluated. Try this:

val it = users.iterator
while(it.hasNext() ) {
   println(it.next().getStatus())
}
遮了一弯 2024-10-29 00:20:12

如果您使用 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)

If you use Scala 2.8, you could use JavaConversion to convert Java collection to Scala collection automatically.

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)
浪推晚风 2024-10-29 00:20:12

或有什么问题呢

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

just或 Even

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

如果您担心两次遍历集合,那么

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

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

What's wrong with just

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

or even

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

or, if you're worried about traversing the collection twice

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

IOW: Why do you want to manage the iteration yourself (and possibly make mistakes), when you can just let someone else do the work for you?

赤濁 2024-10-29 00:20:12

与 scala.collection.JavaConversions 相比,我更喜欢 scalaj-collection。这使得转换变得明确:

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

I prefer scalaj-collection to scala.collection.JavaConversions. This makes the conversions explicit:

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)

Available here: https://github.com/scalaj/scalaj-collection

掐死时间 2024-10-29 00:20:12

我建议使用

scala.collection.JavaConverters._

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

I suggest using

scala.collection.JavaConverters._

and simply add .asScala to every object you wish to iterate

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文