在我的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]?或者我不应该在这里使用收益率?
答案 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)
当用于理解时,基础代码使用map
,flatMap
,foreach
,filter
或withFilter
- 查看相关问题。在这个特定的例子中,该代码等同于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