【问题标题】:Convert a Scala Buffer to Java ArrayList将 Scala 缓冲区转换为 Java ArrayList
【发布时间】:2011-03-18 09:42:33
【问题描述】:

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

// 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]?或者我不应该在这里使用产量吗?

【问题讨论】:

  • 这是一个超级旧的线程,但对于任何想要这样做的人来说——这里接受的答案现在已弃用。请改用scala.jdk.CollectionConverters

标签: java scala scala-2.8


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    var newArray = new ArrayList[Int] (buffer)
    

    【讨论】:

    • 这可能会起作用,因为它将被隐式转换为 java.util.List。好东西,虽然有时你真的不需要一个 ArrayList 而不仅仅是一个 List。
    【解决方案3】:

    当使用推导式时,底层代码使用mapflatMapforeachfilterwithFilter——请参阅相关问题。在这个特定的示例中,该代码相当于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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-14
      • 2022-08-05
      • 2020-04-26
      • 1970-01-01
      • 2018-06-29
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多