将Java集合转换为Scala等效集合的最简单方法是使用JavaConversions,自Scala 2.8以来。这些隐式定义返回所包含Java集合的包装器。
Scala 2.9引入了并行集合,可以在集合上执行并行操作并稍后收集结果。这很容易实现,将现有集合转换为并行集合只需简单地执行以下操作:
myCollection.par
但是,使用 JavaConversions 将 Java 集合转换为 Scala 集合再使用 'par' 存在问题。正如 Parallel Collection Conversions 中所述,内在的串行集合通过评估所有值并将其添加到新的并行集合中而“强制”转换为新的并行集合:
当原始的 Java 集合旨在进行惰性评估时,这会导致问题。例如,如果只返回一个 Java Iterable,然后将其转换为 Scala Iterable,无法保证 Iterable 的内容是否打算急切地访问。因此,应该如何从 Java 集合创建并行集合而不支持评估每个元素的成本?使用并行集合并希望“获取”提供的前 n 个结果来并行执行它们可以避免这种成本。其他集合,例如列表、队列或流,本质上是串行的,这意味着必须一个接一个地访问元素。这些集合通过将元素复制到类似的并行集合中转换为其并行变体。例如,函数式列表被转换为标准不可变并行序列,即并行向量。
根据Parallel Collection Conversions,有一系列的集合类型成本为常量,但是似乎无法保证这些类型可以通过 JavaConversions 创建(例如,可以创建 'Set',但这是一个 'HashSet' 吗?)。