変換する簡単な方法はありますか
Java.lang.Iterable[_]
に
Scala.Iterable[_]
?
Scala 2.8では、これははるかに簡単になりました。これを達成する方法は2つあります。1つは明示的なものです(ただしses暗黙的):
import scala.collection.JavaConverters._
val myJavaIterable = someExpr()
val myScalaIterable = myJavaIterable.asScala
編集:私がこれを書いてから、Scalaコミュニティは、JavaConverters
は良好であり、JavaConversions
は広いコンセンサスに達しました悪い、距離で不気味なアクションが発生する可能性があるため、JavaConversions
は使用しないでください。
そして、より暗黙的な暗黙のようなものです::)
import scala.collection.JavaConversions._ val myJavaIterable = someExpr() for (magicValue <- myJavaIterable) yield doStuffWith(magicValue)
はい暗黙変換を使用します:
import Java.lang.{Iterable => JavaItb}
import Java.util.{Iterator => JavaItr}
implicit def jitb2sitb[T](jit: JavaItb[T]): Iterable[T] = new SJIterable(jit);
implicit def jitr2sitr[A](jit: JavaItr[A]): Iterator[A] = new SJIterator(jit)
その後、簡単に実装できます。
class SJIterable[T](private val jitb: JavaItr[T]) extends Iterable[T] {
def elements(): Iterator[T] = jitb.iterator()
}
class SJIterator[T](private val jit: JavaItr[T]) extends Iterator[T] {
def hasNext: Boolean = jit hasNext
def next: T = jit next
}
開始中Scala 2.13
、 パッケージ - scala.jdk.CollectionConverters
廃止されたパッケージを置き換えますscala.collection.JavaConverters/JavaConversions
:
import scala.jdk.CollectionConverters._
// val javaIterable: Java.lang.Iterable[Int] = Iterable(1, 2, 3).asJava
javaIterable.asScala
// Iterable[Int] = List(1, 2, 3)