2009-07-02 8 views
42

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

Scala.Iterable[_] 

java.lang.Iterable[_] 

を変換する簡単な方法はありますか?その後、容易に実現できる

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) 

:Scalaの2.8では

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 
} 

答えて

65

これははるかに容易になり、それを達成するには、2つの方法がある

11

はい暗黙の変換を使用しています。ソートの明示のOne(それ暗黙を使用していますが):

import scala.collection.JavaConverters._ 

val myJavaIterable = someExpr() 

val myScalaIterable = myJavaIterable.asScala 

編集:私はこれを書いているのでは、ScalaのコミュニティはJavaConvertersが良好であることを幅広い合意に達した、とJavaConversionsはので、悪いです遠回りの恐るべき行動の可能性を示しています。したがって、JavaConversionsはまったく使用しないでください!


そして、より多くの暗黙の暗黙のようなものだ1::)

import scala.collection.JavaConversions._ 

val myJavaIterable = someExpr() 

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

+0

おかげで、私は標準のScalaのlibsでこのような何かがあった期待していたが、あなたのように」示されているように、あなた自身を回すのは難しいことではありません。 –

+1

これは、これとは逆のコードがどれくらいあるかを考えるのはばかげている! –

+5

これはScala 2.8から始まる標準ライブラリにあります。 –

関連する問題