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] |