2010-07-20 129 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 
相关问题