2009-07-02 9 views
42

वहाँ एक आसान तरीका एकमैं जावा इटेबल को स्केल इटेबल में कैसे परिवर्तित कर सकता हूं?

java.lang.Iterable[_] 
एक

Scala.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) 

कौन सा तो आसानी से लागू किया जा सकता है::

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.8 में इतना ज्यादा आसान हो गया है, और वहाँ इसे प्राप्त करने के दो तरीके हैं

11

हाँ निहित रूपांतरण का उपयोग। उस तरह की स्पष्ट है एक (हालांकि यह implicits उपयोग करता है):

import scala.collection.JavaConverters._ 

val myJavaIterable = someExpr() 

val myScalaIterable = myJavaIterable.asScala 

संपादित करें: जब से मैं यह लिखा, स्काला समुदाय पर व्यापक सहमति है कि JavaConverters अच्छा है पर आ गया है, और JavaConversions बुरा है, क्योंकि डरावनी-क्रिया-दूरी के लिए संभावित क्षमता। तो JavaConversions बिल्कुल उपयोग न करें!


और एक और की तरह एक अंतर्निहित निहित है कि: :)

import scala.collection.JavaConversions._ 

val myJavaIterable = someExpr() 

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

+0

धन्यवाद, मैं उम्मीद कर रही थी वहाँ मानक स्काला libs में कुछ इस तरह था, लेकिन आप के रूप में ' दिखाया गया है, अपने आप को रोल करना मुश्किल नहीं है। –

+1

यह हास्यास्पद सोच रहा है कि यह कितना कोड होगा, यह दूसरी तरफ होगा! –

+5

यह स्कैला 2.8 से शुरू होने वाली मानक लाइब्रेरी में होगा। –

संबंधित मुद्दे