Java コレクションを同等の Scala に変換する最も簡単な方法は、Scala 2.8 以降、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」ですか?)。