59 votes

Comment puis-je convertir un Iterable Java en un Iterable Scala?

Existe-t-il un moyen simple de convertir un

 java.lang.Iterable[_]
 

à un

 Scala.Iterable[_]
 

?

88voto

Alex Cruise Points 4809

En Scala 2.8 c'est devenu beaucoup plus facile, et il y a deux façons d'y parvenir. Celui qui est en quelque sorte explicite (bien qu'il utilise implicites):

import scala.collection.JavaConverters._

val myJavaIterable = someExpr()

val myScalaIterable = myJavaIterable.asScala

EDIT: Depuis que j'ai écrit, à la Scala de la communauté est parvenu à un large consensus JavaConverters est bon, et JavaConversions est mauvais, à cause du potentiel pour spooky action at-a-distance. Donc, ne pas utiliser JavaConversions à tous!


Et celui qui est plus comme un implicite implicite: :)

import scala.collection.JavaConversions._

val myJavaIterable = someExpr()

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

11voto

oxbow_lakes Points 70013

Oui, utilisez des conversions implicites :

 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)
 

Qui peut ensuite être facilement implémenté:

 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
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X