Frage

Gibt es eine einfache Möglichkeit, ein

konvertieren
java.lang.Iterable[_]

a

Scala.Iterable[_]

?

War es hilfreich?

Lösung

In Scala 2.8 wurde dies viel viel einfacher, und es gibt zwei Möglichkeiten, es zu erreichen. Eine, die Art von expliziten ist (obwohl es verwendet implicits):

import scala.collection.JavaConverters._

val myJavaIterable = someExpr()

val myScalaIterable = myJavaIterable.asScala

EDIT: Da ich dies schrieb, hat die Scala Gemeinschaft zu einem breiten Konsens gekommen, dass JavaConverters ist gut, und JavaConversions ist schlecht, weil das Potenzial für spooky-Action-at-a-Abstand . So verwenden Sie nicht JavaConversions überhaupt nicht!


und eine, die eher wie ein impliziter implizit ist:)

import scala.collection.JavaConversions._

val myJavaIterable = someExpr()

for (magicValue <- myJavaIterable) yield doStuffWith(magicValue)

Andere Tipps

Ja verwenden implizite Conversions:

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)

, die dann leicht umgesetzt werden können:

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
}

Starten Scala 2.13, Paket

scroll top