web-dev-qa-db-ja.com

Java IterableをScala Iterableに変換するにはどうすればよいですか?

変換する簡単な方法はありますか

Java.lang.Iterable[_]

Scala.Iterable[_]

54
Matt R

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)
79
Alex Cruise

はい暗黙変換を使用します:

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
}
12
oxbow_lakes

開始中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)
2
Xavier Guihot