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