25

一致する要素を抽出するために、ライブラリ(JXPath )を使用してBeanのグラフをクエリしています。ただし、JXPathは一致する要素のグループをjava.lang.Iteratorのインスタンスとして返すため、不変のscalaリストに変換したいと思います。イテレータを反復処理し、各反復ステップで新しい不変リストを作成するよりも簡単な方法はありますか?

4

2 に答える 2

35

ListJavaから来たときは非常に馴染みがあり、Listは不変のデフォルトの実装ですが、Seqコレクションの最良の選択ではないことがよくありますが、の必要性を再考することをお勧めします。

リストに最適な操作は、イテレータを介してすでに利用可能な操作です(基本的に、連続するヘッド要素と先頭要素を取得します)。イテレータが必要なものをまだ提供していない場合は、リストが最良の選択ではないことをほぼ保証できます。ベクトルの方が適切です。


それを邪魔しないでください...JavaコレクションとScalaコレクションの間で変換するための推奨される手法(Scala 2.8.1以降)は、を介して行われscala.collection.JavaConvertersます。これにより、より詳細な制御がJavaConversions可能になり、暗黙的な競合の可能性を回避できます。

この方法では、直接暗黙の変換は行われません。代わりに、コレクションasScalaasJavaメソッドを追加して、変換を明示的に実行できるようにします。

JavaイテレータをScalaイテレータに変換するには:

javaIterator.asScala

JavaイテレータをScalaリストに変換するには(scalaイテレータを介して):

javaIterator.asScala.toList

toSeqの代わりに変換を検討することもできますtoList。イテレータの場合、これは-を返します。これにより、よりリッチなインターフェイスStream内でイテレータの遅延動作を保持できます。Seq

編集:メソッドは ありませんtoVectorが、(ダニエルが指摘したように)デフォルトのサブクラスとして(デフォルトと同じように)toIndexedSeqを返すメソッドがあります。VectorIndexedSeqListSeq

javaIterator.asScala.toIndexedSeq
于 2011-05-16T09:22:28.610 に答える
8

編集:おそらく、ケビン・ライトの答えを見る必要があります。これは、暗黙の魔法が少なく、Scala 2.8.1以降に利用可能なより良いソリューションを提供します。


から暗黙的な変換をインポートしてscala.collection.JavaConversions、新しい Scala コレクションをシームレスに作成できます。たとえば、次のようになります。

import collection.JavaConversions._
println(List() ++ javaIterator)

Java イテレータは によって Scala イテレータに変換されますJavaConversions.asScalaIterator。コレクションを と連結するために必要な引数の型である、型Aimplementsの要素を持つ Scala イテレータ。TraversableOnce[A]++

別のコレクション型が必要な場合は、必要List()なものに変更してください (例:IndexedSeq()またはcollection.mutable.Seq()など)。

于 2011-05-16T08:43:24.767 に答える