2011-03-14 84 views
5

我在Scala項目中使用Java Twitter4J庫。無法在Scala中迭代Java列表

我打電話的方法

twitter.getFriendsStatuses() 

該方法返回一個包含狀態twitter4j.User對象的列表。

我試圖在它們之間迭代,並在第一元素進入無限循環:

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

任何想法?

回答

24

我想users.iterator每次評估時都會產生新的迭代器。試試這個:

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

感謝。我爲什麼沒有想到這一點! :-) – Sri 2011-03-14 13:49:57

8

出了什麼問題只是

甚至

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

,或者,如果你擔心遍歷集合兩次

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

督察:你爲什麼想要管理你的迭代? f(可能會犯錯誤),當你可以讓別人爲你做工作嗎?

+0

用於添加「視圖」的用法+1 – gpampara 2011-03-14 14:35:46

+0

沒有錯。我剛開始學習Scala。感謝這些例子! PS:這些是Java列表,將檢查您的示例是否工作。 – Sri 2011-03-14 14:53:23

+0

不,對不起。 Twitter4J返回給我一個java.util.List,並且.foreach,.map,.view.map不起作用。是否有一些簡潔的方式將它們轉換爲Scala列表並使用.foreach,.map和.view的? – Sri 2011-03-14 14:56:58

17

如果您使用Scala 2.8,則可以使用JavaConversion將Java集合自動轉換爲Scala集合。

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

+1

我不知道scalaj集合,但在Scala 2.8中,至少,如果需要它們,'import scala.collection.JavaConverters._'會給你顯式的'.asScala'conversions。 – 2011-03-14 19:02:46

+0

是的,我聽說過,但沒有時間真正查看JavaConverters的實現。 scalaj集合很乾淨,所以我一直堅持。 – 2011-03-14 21:27:54

1

我建議使用

scala.collection.JavaConverters._

,並簡單地添加.asScala到每一個對象,你要遍歷