将Scala缓冲区转换为Java ArrayList
在我的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 [用户]?或者我不应该在这里使用产量?
您应该能够通过指定输入你想要什么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
,通过你的List
到ArrayList
构造,这需要Collection
:
new ArrayList(buffer)
你可以通过缓冲ArrayList中构造函数来创建一个新的Java的ArrayList:
var newArray = new ArrayList[Int] (buffer)
当一个用来解析,下面的代码使用map
,flatMap
,foreach
,filter
或withFilter
- 见相关的问题。在这个特定的例子中,该代码将等于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
这可能会因工作的事实,它会被隐式转换为一个java.util.List。好东西,虽然有时你真的不需要一个ArrayList而不只是一个List。 – Calum 2010-07-20 12:32:43