आप एक Iterable
में एक Iterator
परिवर्तित बहुत सावधान के बारे में कभी परोक्ष हो (मैं सामान्य रूप से Iterator.toList
का उपयोग करें - स्पष्ट रूप से) चाहिए। इसका कारण यह है कि, परिणाम को एक विधि (या फ़ंक्शन) में पास करके जो Iterable
की अपेक्षा करता है, आप इस पर नियंत्रण खो देते हैं कि आपका प्रोग्राम टूटा जा सकता है।
def printTwice(itr : Iterable[String]) : Unit = {
itr.foreach(println(_))
itr.foreach(println(_))
}
तो एक Iterator
किसी भी तरह एक Iterable
में परोक्ष परिवर्तनीय थे, क्या निम्नलिखित मुद्रित होता होगा: यहाँ एक उदाहरण है?
printTwice(Iterator.single("Hello"))
यह (बेशक) केवल हैलो एक बार प्रिंट होगा। हाल ही में, trait
TraversableOnce
संग्रह पुस्तकालय में जोड़ा गया है, जो 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
स्रोत
2010-04-30 20:27:05
नकल http://stackoverflow.com/questions/1072784/how-can-i-convert-a-java-iterable-to-a-scala-iterable – wheaties
@wheaties यह एक नहीं है उस प्रश्न का डुप्लिकेट। –