【发布时间】:2012-10-03 06:45:56
【问题描述】:
The easiest way to convert a Java Collection to a Scala equivalent is using JavaConversions, since Scala 2.8.。这些隐式定义返回包含的 Java 集合的包装器。
Scala 2.9 引入了并行集合,对集合的操作可以并行执行,然后再收集结果。这很容易实现,将现有集合转换为并行集合非常简单:
myCollection.par
但是在使用 JavaConversions 从 Java 集合转换而来的集合上使用“par”会出现问题。如Parallel Collection Conversions 中所述,通过评估所有值并将它们添加到新的并行集合中,固有的顺序集合被“强制”到新的并行集合中:
其他集合,例如列表、队列或流,本质上是 顺序的意思是元素必须在之后访问 另一个。这些集合被转换为它们的并行变体 通过将元素复制到类似的并行集合中。为了 例如,函数列表被转换为标准的不可变 并行序列,是一个并行向量。
当原始 Java 集合打算被延迟评估时,这会导致问题。例如,如果只返回一个 Java Iterable,然后转换为 Scala Iterable,则不能保证 Iterable 的内容是否会被急切地访问。 那么应该如何从 Java 集合创建并行集合,而不需要维持评估每个元素的成本? 我试图通过使用并行集合来并行执行它们来避免这种成本,并希望'获取提供的前 n 个结果。
根据Parallel Collection Conversions,有一系列的集合类型会花费恒定的时间,但似乎没有办法保证这些类型可以由 JavaConversions 创建(例如,可以创建“Set” ,但那是一个'HashSet'吗?)。
【问题讨论】:
-
请注意,最好使用 JavaConverters 而不是 JavaConversions 作为后者,这样您就可以执行类似 .asScala.toList.par 之类的操作。
标签: java scala collections parallel-collections