繁体   English   中英

将Scala缓冲区转换为Java ArrayList

[英]Convert a Scala Buffer to Java ArrayList

在我的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]? 或者我不应该在这里使用收益率?

您应该能够通过指定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)

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

这里发生的可能不直观,也许可以改进的是, ArrayList没有实现map 隐式转换为您提供了一个Buffer ,而是和一个map上的Buffer返回一个Buffer

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

但是你可以随时这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM