読者です 読者をやめる 読者になる 読者になる

Java コレクションと Scala コレクションの相互変換


Java コレクションと Scala コレクションは、implicit により相互変換を簡単に、というか、意識せずに行うことができます。
以前は scala.collection.jcl でしたが、Scala 2.8 から scala.collection.JavaConversions としてコンバータが提供されています。

例えば Java

Javaで、Selector#selectedKeys() のシグネチャは以下のようになっています。

public Set selectedKeys()


結果の Set を繰り返し処理する Java コードは以下のように書けます。

for (SelectionKey key : selector.selectedKeys() ) {
    ・・・
}

例えば Scala で

上記の処理を Scala に持ってくるには JavaConversions をインポートして

import scala.collection.JavaConversions._
for (key: SelectionKey <- selector.selectedKeys ) {
    ・・・
}

と書けます。


java.util.Set から scala.collection.mutable.Set への暗黙的型変換が以下の定義にて行われます。

implicit def asScalaSet[A](s : java.util.Set[A]) : scala.collection.mutable.Set[A]


selector.selectedKeys は scala の Set となるので、より関数的に foreach に書き換えることができますね。

import scala.collection.JavaConversions._
selector.selectedKeys.foreach { key =>
    ・・・
}

逆変換もできます

例えば、Scala の Map を Java の Map として得たい場合も

import scala.collection.JavaConversions._
val map = Map("key1" -> "val1", "key2" -> "val2")
val javaMap: java.util.Map[String, String] = map

とできます。

まとめると

scala.collection.JavaConversions には以下のような暗黙的型変換が定義されています。

変換元 変換先
scala.collection.Iterator[A] java.util.Iterator[A]
scala.collection.Iterator[A]) java.util.Enumeration[A]
scala.collection.Iterable[A]) java.lang.Iterable[A]
scala.collection.Iterable[A]) java.util.Collection[A]
scala.collection.mutable.Buffer[A]) java.util.List[A]
scala.collection.mutable.Seq[A]) java.util.List[A]
scala.collection.Seq[A]) java.util.List[A]
scala.collection.mutable.Set[A]) java.util.Set[A]
scala.collection.Set[A]) java.util.Set[A]
scala.collection.mutable.Map[A, B]) java.util.Map[A, B]
scala.collection.mutable.Map[A, B]) java.util.Dictionary[A, B]
scala.collection.Map[A, B]) java.util.Map[A, B]
scala.collection.mutable.ConcurrentMap[A, B]) java.util.concurrent.ConcurrentMap[A, B]
java.util.Iterator[A]) scala.collection.Iterator[A]
java.util.Enumeration[A]) scala.collection.Iterator[A]
java.lang.Iterable[A]) scala.collection.Iterable[A]
java.util.Collection[A]) scala.collection.Iterable[A]
java.util.List[A]) scala.collection.mutable.Buffer[A]
java.util.Set[A]) scala.collection.mutable.Set[A]
java.util.Map[A, B]) scala.collection.mutable.Map[A, B]
java.util.concurrent.ConcurrentMap[A, B]) scala.collection.mutable.ConcurrentMap[A, B]
java.util.Dictionary[A, B]) scala.collection.mutable.Map[A, B]
java.util.Properties) scala.collection.mutable.Map[scala.Predef.String, scala.Predef.String]