दिलचस्प पोस्ट
क्या मैं अपने मौजूदा जीआईटी रेपो को एक्सप्लैश के साथ इस्तेमाल कर सकता हूं? सी # में उपयोग किए गए स्टेटमेंट का उपयोग करना जावा SAX पार्सर वर्णों को विभाजित करता है () JQuery का उपयोग कर चेकबॉक्स चुनने के लिए तालिका पंक्तियों पर क्लिक करें Google Chrome console.log () ऑब्जेक्ट और एरेज़ के साथ असंगतता कन्वर्टर कन्स्ट्रक्टर की जगह कन्वर्टर कन्स्ट्रक्टर क्यों है? Keytool साइनिंग समस्या: Keystore के साथ छेड़छाड़ किया गया था, या पासवर्ड गलत था जीसीसी और एमएस कम्पाइलर का तत्काल विवरण कैसे एक JSON फ़ाइल को प्रिंट करने के लिए? स्ट्रिंग में किसी भी आधार में एक पूर्णांक कैसे परिवर्तित करें? क्या मैं एएसपी.नेट में ब्राउज़र का टाइम ज़ोन प्राप्त कर सकता हूं या मुझे सूचना प्राप्त करने के लिए जेएस ऑपरेशन पर भरोसा करना पड़ सकता है? क्या मैं इस घटना को माता-पिता से एंजियर 2 में बच्चे में छोड़ देता हूं वॉचकिट SDK NSUserDefaults से डेटा पुनर्प्राप्त नहीं कर रहा है सीन के लिए सीमांकक बदलना (सी ++) जावा में देरी कैसे करें?

स्काला में जावा कलेक्शन पर फिराना

मैं कुछ स्कला कोड लिख रहा हूं जो अपाचे POI API का उपयोग करता है। मैं java.util.Iterator में निहित पंक्तियों को फिर से करना चाहता हूं। java.util.Iterator कि मैं शीट क्लास से मिलता हूं। मैं for each शैली के लूप के for each इटरेटर का उपयोग करना चाहता हूं, इसलिए मैं इसे एक मूल स्कला संग्रह में बदलने की कोशिश कर रहा हूं, लेकिन कोई भाग्य नहीं होगा।

मैंने स्कला आवरण वर्गों / लक्षणों को देखा है, लेकिन मुझे ये नहीं पता है कि उन्हें सही तरीके से कैसे उपयोग करें मैं वर्बोज का उपयोग किए बिना जावा संग्रह पर कैसे पुनरावृत्त करूं, while(hasNext()) getNext() लूप की शैली?

सही उत्तर के आधार पर मैंने लिखा कोड है:

 class IteratorWrapper[A](iter:java.util.Iterator[A]) { def foreach(f: A => Unit): Unit = { while(iter.hasNext){ f(iter.next) } } } object SpreadsheetParser extends Application { implicit def iteratorToWrapper[T](iter:java.util.Iterator[T]):IteratorWrapper[T] = new IteratorWrapper[T](iter) override def main(args:Array[String]):Unit = { val ios = new FileInputStream("assets/data.xls") val workbook = new HSSFWorkbook(ios) var sheet = workbook.getSheetAt(0) var rows = sheet.rowIterator() for (val row <- rows){ println(row) } } } 

Solutions Collecting From Web of "स्काला में जावा कलेक्शन पर फिराना"

एक आवरण वर्ग ( scala.collection.jcl.MutableIterator.Wrapper ) है। इसलिए यदि आप परिभाषित करते हैं

 implicit def javaIteratorToScalaIterator[A](it : java.util.Iterator[A]) = new Wrapper(it) 

तो यह स्कला इटरेटर के एक उप वर्ग के रूप में कार्य करेगा ताकि आप foreach कर सकें।

स्काला 2.8 के रूप में, आपको बस जावा कन्वर्सर्स ऑब्जेक्ट आयात करना है, जो पहले से ही उपयुक्त रूपांतरण घोषित करता है।

 import scala.collection.JavaConversions._ 

यह पिछले संस्करणों में हालांकि काम नहीं करेगा।

सही उत्तर यहां जावा के Iterator से कुछ कस्टम प्रकार से एक अंतर्निहित रूपांतरण को परिभाषित करना है। इस प्रकार को foreach विधि लागू करना चाहिए जो अंतर्निहित Iterator लिए प्रतिनिधि है। यह आपको किसी भी जावा Iterator साथ -लोप के for स्काला का उपयोग करने की अनुमति देगा।

स्कला 2.10 के लिए:

 // Feature warning if you don't enable implicit conversions... import scala.language.implicitConversions import scala.collection.convert.WrapAsScala.enumerationAsScalaIterator 

स्काला 2.10.4+ (और संभवत: पहले) के साथ संभव है कि जावा.उथिल.इटरेटर [ए] को स्कैला.कॉल्लेक्शन.इटरेटर [ए] को स्केल कोक्शन आयात करके संभवतया परिवर्तित किया जा सकता है। जावा कॉन्ंकर्सेंस। एस्कालाइटरेटर। यहाँ एक उदाहरण है:

 object SpreadSheetParser2 extends App { import org.apache.poi.hssf.usermodel.HSSFWorkbook import java.io.FileInputStream import scala.collection.JavaConversions.asScalaIterator val ios = new FileInputStream("data.xls") val workbook = new HSSFWorkbook(ios) var sheet = workbook.getSheetAt(0) val rows = sheet.rowIterator() for (row <- rows) { val cells = row.cellIterator() for (cell <- cells) { print(cell + ",") } println } } 

आप जावा संग्रह को किसी सरणी में परिवर्तित कर सकते हैं और इसका इस्तेमाल कर सकते हैं:

 val array = java.util.Arrays.asList("one","two","three").toArray array.foreach(println) 

या फिर आगे बढ़ें और सरला को स्काला सूची में कनवर्ट करें:

 val list = List.fromArray(array) 

स्काला 2.12.0 स्केल को हटाया जाता है। कोलेक्शन। जावा scala.collection.JavaConversions , इसलिए 2.12.0 से ऐसा करने का एक तरीका कुछ ऐसा होगा:

 import scala.collection.JavaConverters._ // ... for(k <- javaCollection.asScala) { // ... } 

(आयात पर ध्यान दें, नया जावा कन्वर्टर्स, जावा कन्वर्सेशन का बहिष्कार है)

यदि आप scala.collection.javaConversions में implicits से बचने के लिए चाहते हैं तो आप स्पष्ट रूप से कनवर्ट करने के लिए scala.collection.JavaConverters का उपयोग कर सकते हैं।

 scala> val l = new java.util.LinkedList[Int]() l: java.util.LinkedList[Int] = [] scala> (1 to 10).foreach(l.add(_)) scala> val i = l.iterator i: java.util.Iterator[Int] = java.util.LinkedList$ListItr@11eadcba scala> import scala.collection.JavaConverters._ import scala.collection.JavaConverters._ scala> i.asScala.mkString res10: String = 12345678910 

जावा Iterator को स्कला Iterator कनवर्ट करने के लिए asScala विधि का उपयोग ध्यान दें।

JavaConverters Scala 2.8.1 के बाद से उपलब्ध है।

यदि आप एक बड़े डेटासेट के माध्यम से फिर से चल रहे हैं, तो संभवतः आप संपूर्ण संग्रह को मेमोरी में .asScala असत्य रूपांतरण के साथ लोड नहीं करना चाहते हैं। इस मामले में, एक आसान तरीका दृष्टिकोण scala.collection.Iterator विशेषता को लागू करने के लिए है

 import java.util.{Iterator => JIterator} def scalaIterator[T](it: JIterator[T]) = new Iterator[T] { override def hasNext = it.hasNext override def next() = it.next() } val jIterator: Iterator[String] = ... // iterating over a large dataset scalaIterator(jIterator).take(2).map(_.length).foreach(println) // only first 2 elements are loaded to memory 

इसकी समान अवधारणा है लेकिन कम वर्बोस आईएमओ 🙂