2009-07-02 10 views
42

birYinelenen Java'yı Scala Yeniden Yapılandırılabilir'e nasıl dönüştürebilirim?

Scala.Iterable[_] 

bir

java.lang.Iterable[_] 

dönüştürmek için kolay bir yol var mı? Daha sonra kolayca uygulanabilecek

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 olarak

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 
} 

cevap

65

bu kadar çok daha kolay hale geldi ve bunu başarmak için iki yol vardır

11

Evet örtük dönüşüm kullanın. çeşit açık olacak bir okul (o implicits kullanır rağmen):

import scala.collection.JavaConverters._ 

val myJavaIterable = someExpr() 

val myScalaIterable = myJavaIterable.asScala 

DÜZENLEME: Bunu yazdıktan sonra Scala topluluk JavaConverters iyi olduğunu geniş bir uzlaşma ile geldi, ve JavaConversions çünkü kötü Ürkütücü-aksiyon-uzlaşma potansiyeli. Yani hiç JavaConversions kullanmayın!


Ve daha örtük bir örtük gibi bunlardan biri: :)

import scala.collection.JavaConversions._ 

val myJavaIterable = someExpr() 

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

+0

sayesinde, standart Scala kütüphanelerini böyle bir şey vardı umuyordum ama senin kadar' ve gösterilen, kendi rulo yapmak için çok zor değil. –

+1

Bu ne kadar kodun başka bir şekilde olabileceğini düşünmek saçmalık! –

+5

Bu Scala 2.8 ile başlayan standart kütüphanede olacaktır. –

İlgili konular