2010-07-20 123 views
7

在我的Scala函數中,我遍歷Java ArrayCollection,提取應該形成新集合的特定元素。最後,它必須再次成爲Java-ArrayList,因爲我正在與Java Framework進行交互。 我的代碼:將Scala緩衝區轉換爲Java ArrayList

// to make scala-style iterating over arraylist possible 
import scala.collection.JavaConversions._ 

// ArrayList contains elements of this type: 
class Subscription(val subscriber:User, val sender:User) 

// I'm getting this list from Java: 
val jArrayList = new ArrayList[Subscription] 
// Buffer:scala.collection.mutable.Buffer[User] 
val buffer = for (val subscription <- jArrayList) yield subscription.sender 

我如何轉換緩衝到一個ArrayList [用戶]?或者我不應該在這裏使用產量?

回答

7

您應該能夠通過指定輸入你想要什麼buffer是將其轉換回(JavaConversions應該發揮出來的時候自動型你「再試圖讓你有一個不兼容):

val buffer: java.util.List[User] = 
    for (val subscription <- jArrayList) yield subscription.sender 

或者你可以從JavaConversions顯式調用轉換,如果你想使你在做清楚什麼:

val buffer = asList(for (...)) // buffer should have type "java.util.List[User]" 

這些實際上都不產生ArrayList;相反,他們創建了一個通用的List,但直接指定集合類型通常是不好的做法。如果你必須有一個ArrayList,通過你的ListArrayList構造,這需要Collection

new ArrayList(buffer) 
2

你可以通過緩衝ArrayList中構造函數來創建一個新的Java的ArrayList:

var newArray = new ArrayList[Int] (buffer) 
+1

這可能會因工作的事實,它會被隱式轉換爲一個java.util.List。好東西,雖然有時你真的不需要一個ArrayList而不只是一個List。 – Calum 2010-07-20 12:32:43

1

當一個用來解析,下面的代碼使用mapflatMapforeachfilterwithFilter - 見相關的問題。在這個特定的例子中,該代碼將等於jArrayList.map(_.sender),並且map會生成新的集合(爲了簡化,我忽略了隱式轉換)。

這裏發生的情況可能不直觀,也許可以改進,但ArrayList沒有執行map。隱式轉換會給您一個Buffer,而Buffer上的map會返回Buffer

當然,在JavaConversions上的Buffer保留作爲後備存儲的基礎集合,即ArrayList。另一方面,新創建的Buffer不是基於此,而是基於Scala自己的集合之一。

你總是可以做到這一點,雖然:

val buffer = (for (val subscription <- jArrayList) yield subscription.sender).asList 
相關問題