[英]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)
当用于理解时,底层代码使用map
, flatMap
, foreach
, filter
或withFilter
- 查看相关问题。 在这个特定的例子中,该代码将等同于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.