java - 配列 - scala seq




JavaコレクションをScalaコレクションに変換する (6)

Javaコレクションを配列に変換し、それからScalaリストを作成することができます:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)

新しいHashSet(Collection)のScalaに相当する、Javaコレクション( java.util.List )をScalaコレクションListに変換するにはどうすればよいですか?

実際にJava API呼び出しをjava.util.List<T>を返すSpring's SimpleJdbcTemplateに、Scalaの不変のHashSetに変換しようとしています。 したがって、たとえば:

val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l

これはうまくいくようです。 批判は大歓迎!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)

toArray呼び出しに型情報を追加して、Setをパラメータ化することができます。

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

これは、コレクションパッケージがScala 2.8の大規模な修正を行い、scala.collection.jclパッケージが廃止されるため、これが望ましいかもしれません


JavaConversionsrobinstの回答 )とJavaConvertersBen Jamesの答え )は、 Scala 2.10では廃止されました。

JavaConversionsの代わりに:

import scala.collection.convert.wrapAll._

aleksandr_hramcovによって示唆されるように。

JavaConvertersの代わりに:

import scala.collection.convert.decorateAll._

どちらの場合も、コンバージョン/コンバーターをそれぞれJavaまたはScalaにインポートすることも可能です(例:

import scala.collection.convert.wrapAsScala._

更新: JavaConversionsJavaConvertersが廃止されているという上記の記述は間違っているようです。 Scala 2.10に廃止予定のプロパティがいくつかありましたが、それらをインポートする際に廃止予定の警告が発生しました。 したがって、ここでの代替輸入はエイリアスだけであるようです。 私はまだそれらを好むが、IMHOのように名前はより適切である。


この優れたライブラリであるJavaとScalaのコレクション間の双方向変換を持つscalaj-collectionを探求することもできます。 あなたの場合、java.util.ListをScala Listに変換するには、次のようにします:

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala

将来の参考資料:Scala 2.8では、次のようにして行うことができます:

import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet

この後、 setscala.collection.immutable.Set[String]です。

ベン・ジェームズの答えをもっと明示的に(JavaConvertersを使用して)参照してください。これは現在推奨されているようです。


最後の提案はうまくいきますが、 jcl.Buffer使用を避けることもできます:

Set(javaApi.query(...).toArray: _*)

scala.collection.immutable.SetPredef.scalaおかげでデフォルトで利用できるようになっています。





scala-2.7