2010-04-30 18 views
11

क्या स्कैला एक इटरटेबल के साथ एक इटरेटर को परिवर्तित करने (लपेटकर) में अंतर्निर्मित कक्षा, उपयोगिता, वाक्यविन्यास, या अन्य तंत्र प्रदान करता है?पुनरावर्तक से पुनरावर्तक या स्पष्ट रूपांतरण को पुनरावर्तक

उदाहरण के लिए, मैं एक इटरेटर [फू] है और मैं एक Iterable [फू] की जरूरत है, इसलिए वर्तमान में मैं कर रहा हूँ:

val foo1: Iterator[Foo] = .... 
val foo2: Iterable[Foo] = new Iterable[Foo] { 
    def elements = foo1 
} 

यह बदसूरत और अनावश्यक लगता है। एक बेहतर तरीका क्या है?

+0

नकल http://stackoverflow.com/questions/1072784/how-can-i-convert-a-java-iterable-to-a-scala-iterable – wheaties

+3

@wheaties यह एक नहीं है उस प्रश्न का डुप्लिकेट। –

उत्तर

12

Iterator में स्केल 2.8.0 में toIterable विधि है, लेकिन 2.7.7 या उससे पहले नहीं है। यह निहित नहीं है, लेकिन यदि आपको आवश्यकता है तो आप अपने स्वयं के निहित रूपांतरण को परिभाषित कर सकते हैं।

7

आप एक Iterable में एक Iterator परिवर्तित बहुत सावधान के बारे में कभी परोक्ष हो (मैं सामान्य रूप से Iterator.toList का उपयोग करें - स्पष्ट रूप से) चाहिए। इसका कारण यह है कि, परिणाम को एक विधि (या फ़ंक्शन) में पास करके जो Iterable की अपेक्षा करता है, आप इस पर नियंत्रण खो देते हैं कि आपका प्रोग्राम टूटा जा सकता है।

def printTwice(itr : Iterable[String]) : Unit = { 
    itr.foreach(println(_)) 
    itr.foreach(println(_)) 
} 

तो एक Iterator किसी भी तरह एक Iterable में परोक्ष परिवर्तनीय थे, क्या निम्नलिखित मुद्रित होता होगा: यहाँ एक उदाहरण है?

printTwice(Iterator.single("Hello")) 

यह (बेशक) केवल हैलो एक बार प्रिंट होगा। हाल ही में, traitTraversableOnce संग्रह पुस्तकालय में जोड़ा गया है, जो Iterator और Iterable को एकीकृत करता है। मेरे दिमाग में, यह तर्कसंगत रूप से एक गलती है।

मेरी निजी वरीयता Iterator का उपयोग कहीं भी संभव है और फिर List, Set या IndexedSeq का उपयोग करें। मैंने पाया है कि मैं शायद ही कभी एक विधि लिख सकता हूं जो कि पारित होने वाले प्रकार के वास्तव में अज्ञेयवादी है। एक उदाहरण:

def foo(trades: Iterable[Trade]) { 
    log.info("Processing %d trades", trades.toList.length) //hmmm, converted to a List 

    val shorts = trades.filter(_.side.isSellShort) 
    log.info("Found %d sell-short", shorts.toList.length) //hmmm, converted to a List again 

    //etc 
+4

मैंने आपको बताया क्योंकि आपका कथन "यह (निश्चित रूप से) केवल एक बार हैलो प्रिंट करेगा" झूठा है। स्कैला की 'टूटेबल' स्ट्रीम में इटरेटर को लपेटती है, जो सुनिश्चित करती है कि आपको उचित एकाधिक पुनरावृत्ति अर्थशास्त्र मिल जाए। इससे आपका बहुत अधिक जवाब गलत हो जाता है। –

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