scala - CollectionConverters 总是返回原始源对象?

标签 scala performance wrapper scala-collections scala-java-interop

CollectionConverters API状态

In all cases, converting from a source type to a target type and back again will return the original source object.

这似乎并不总是正确的。例如,在下面的情况下,它确实是 true

val orig = ListBuffer(1,2,3)
assert(orig.asJava.asScala eq orig)   // OK

但是here断言失败

val orig = ListBuffer(1,2,3).asJava
assert(orig.asScala.asJava eq orig)   // Boom!

更改为 List 而不是 ListBuffer 断言通过

val orig = List(1,2,3).asJava
assert(orig.asScala.asJava eq orig)   // OK

中间的情况是否意味着已制作副本?如果是这样,关于何时制作副本从而影响性能的确切规则是什么?

最佳答案

asJavaasScala 从不复制整个集合,但它们会实例化包装器。

val orig = ListBuffer(1,2,3).asJava之后,orig是一个包装器,是类scala.collection.convert的实例。 JavaCollectionWrappers$MutableBufferWrapper

在下一个.asScala之后,您将获得原始的ListBuffer

现在您再次调用.asJava。此时,除了实例化新包装器而不是(正如您所发现的)eq 到先前的包装器之外,没有其他可能的结果。

您引用的保证适用于原始集合,而不适用于转换包装器。也许措辞应该更清楚。

关于scala - CollectionConverters 总是返回原始源对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60235285/

相关文章:

facebook - Scala 有哪些 Facebook 库?

'should contain' 的 Scalatest 自定义匹配器

performance - 如何在 vim 中基于增量搜索切换选项卡?

cocoa - 创建简单的 cocoa 应用程序包装器

c++ - 完美转发构造函数的包装器

scala - 在集群节点上运行的 Akka Streams

java - 如何在 MongoDB Java 驱动程序 3 中插入​​文档

web-scraping - 网页抓取软件是 "wrapper"吗?

javascript - 有没有更好的方法来检测 nextUntil 是否定期停止?

mysql - SQL 性能 : Which is quicker? IN() 与 JOIN