将Scala缓冲区转换为Java ArrayList

时间:2010-07-20 11:52:57

标签: java scala scala-2.8

在我的Scala函数中,我遍历Java ArrayCollection,提取应该构成新集合的特定元素。最后,它必须再次成为Java-ArrayList,因为我正在与Java Framework交互。 我的代码:

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

如何将Buffer转换为ArrayList [User]?或者我不应该在这里使用收益率?

3 个答案:

答案 0 :(得分:8)

你应该能够通过指定你想要的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 )

答案 1 :(得分:2)

您可以在ArrayList构造函数中传递缓冲区以创建新的java ArrayList:

var newArray = new ArrayList[Int] (buffer)

答案 2 :(得分:1)

当用于理解时,基础代码使用mapflatMapforeachfilterwithFilter - 查看相关问题。在这个特定的例子中,该代码等同于jArrayList.map(_.sender)map生成新的集合(我忽略了隐式转换,以保持简单)。

这里发生的事情可能不直观,也许可以改进,ArrayList没有实现map。隐式转换会为您提供Buffer,而map上的Buffer会返回Buffer

当然,Buffer上的JavaConversions会将基础集合ArrayList保留为后备存储。另一方面,新创建的Buffer不会基于此,而是基于Scala自己的一个集合。

你可以随时这样做:

val buffer = (for (val subscription <- jArrayList ) yield subscription.sender).asList