从 Scala 2.8 开始,将 Java Collection 转换为 Scala 等价物的最简单方法是使用 JavaConversions。. 这些隐式定义返回包含的 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'?)。