一致する要素を抽出するために、ライブラリ( JXPath )を使用してBeanのグラフをクエリしています。ただし、JXPathは一致する要素のグループをJava.lang.Iteratorのインスタンスとして返すため、不変のscalaリストに変換したいと思います。反復するよりも簡単な方法はありますか。イテレータを超えて、各反復ステップで新しい不変リストを作成しますか?
List
の必要性を再考することをお勧めしますが、Javaから来ると非常に馴染みがあり、Listは不変のSeq
のデフォルトの実装ですが、多くの場合、最良の選択ではありません。コレクションの。
リストが最適な操作は、イテレータを介してすでに利用可能な操作です(基本的に、連続するヘッド要素と先頭要素を取得します)。イテレータが必要なものをまだ提供していない場合は、リストが最良の選択ではないことをほぼ保証できます。ベクトルの方が適切です。
JavaとScalaコレクションの間で変換するための推奨される手法(Scala 2.8 .1)経由 scala.collection.JavaConverters
。これにより、JavaConversions
よりも詳細に制御でき、暗黙的な競合の可能性を回避できます。
この方法では、直接暗黙の変換は行われません。代わりに、asScala
メソッドとasJava
メソッドをコレクションに追加して、変換を明示的に実行できるようにします。
Javaイテレータをa Scalaイテレータに変換するには:
javaIterator.asScala
JavaイテレータをScalaリストに変換するには(scalaイテレータを介して):
javaIterator.asScala.toList
toSeq
の代わりにtoList
を変換することを検討することもできます。イテレータの場合、これはStream
を返します。これにより、よりリッチなSeq
インターフェイス内でイテレータの遅延動作を保持できます。
EDIT:toVector
メソッドはありませんが、(Danielが指摘したように)toIndexedSeq
メソッドがあります。 Vector
をデフォルトのIndexedSeq
サブクラスとして(List
がデフォルトのSeq
であるのと同じように)。
javaIterator.asScala.toIndexedSeq
EDIT:おそらく Kevin Wrightの答え を見る必要があります。これはScala 2.8.1、暗黙の魔法が少ない。
_scala.collection.JavaConversions
_ から暗黙的な変換をインポートしてから、新しいScalaコレクションをシームレスに作成できます(例:次のように))。
_import collection.JavaConversions._
println(List() ++ javaIterator)
_
あなたのJavaイテレータは_JavaConversions.asScalaIterator
_によってScalaイテレータに変換されます。AScalaタイプの要素を持つイテレータA
は_TraversableOnce[A]
_を実装します。これは、コレクションを_++
_と連結するために必要な引数タイプです。
別のコレクションタイプが必要な場合は、List()
を必要なものに変更するだけです(例:IndexedSeq()
またはcollection.mutable.Seq()
など)。