मैं opencsv का उपयोग csv फ़ाइलें पार्स करने के लिए, और मेरे कोडस्काला इकाई प्रकार
while((line = reader.readNext()) != null) { .... }
मैं एक संकलक चेतावनी कह मिल गया है?
मैं opencsv का उपयोग csv फ़ाइलें पार्स करने के लिए, और मेरे कोडस्काला इकाई प्रकार
while((line = reader.readNext()) != null) { .... }
मैं एक संकलक चेतावनी कह मिल गया है?
आपके मामले में (लाइन = reader.readNext()) एक कार्यात्मक शाब्दिक है जो यूनिट लौटाता है। इस प्रकार आप कोड को फिर से लिखने हो सकता है:
while({line = reader.readNext(); line!= null}) { .... }
स्कैला में असाइनमेंट कोई मान नहीं देता है, यूनिट सी या सी ++ में शून्य के समान है।
कोशिश
var line = ""
while ({line = reader.readNext(); line != null}) { ... }
यह काम करता है क्योंकि एक ब्लॉक में पिछले अभिव्यक्ति के मूल्य दिया जाता है और इस मामले में यह एक बूलियन जिसके द्वारा आवश्यक है जबकि
'स्केल में यूनिट' 'शून्य 'की तुलना में' शून्य' के समान है। – Jesper
अच्छा बिंदु धन्यवाद, मैं उपरोक्त को सही कर दूंगा। –
एक काम अभिव्यक्ति टाइप स्काला में Unit
है। यही आपके संकलक चेतावनी का कारण है।
वहाँ स्काला में एक अच्छा मुहावरा है कि जब तक पाश से बचा जाता है है:
val iterator = Iterator.continually(reader.readNext()).takeWhile(_ != null)
यह आपको जो कुछ reader.readNext
रिटर्न पर एक iterator देता है।
continually
विधि एक "अनंत" पुनरावर्तक देता है और takeWhile
उस का उपसर्ग लेता है, लेकिन पहले शून्य सहित नहीं।
(स्काला 2.8)
हम्म पर संकलित हो जाएगा। मेरा जवाब वास्तव में सवाल से मेल नहीं खाता है। मैं इसे रखूंगा, यह वैसे भी उपयोगी हो सकता है। – mkneissl
आपको क्यों नहीं लगता कि आपका उत्तर प्रश्न से मेल खाता है? –
@ केन: पोर्टोलेट ने यूनिट के बारे में चेतावनी के लिए स्पष्टीकरण मांगा। मैंने एक लूप मुहावरे के साथ जवाब दिया। मैंने जवाब को पूरा करने के लिए चेतावनी के लिए स्पष्टीकरण जोड़ा है। स्पष्टीकरण के लिए – mkneissl
आप स्काला कोड वे जिस तरह से आप यह जावा में लिखते थे लिख रहे हैं। इसे और अधिक स्कैला जैसी तरीके से करने का प्रयास करें। लाइन द्वारा एक पाठ फ़ाइल लाइन पढ़ सकते हैं और प्रत्येक पंक्ति के साथ कुछ करने के लिए, इस प्रयास करें:
import java.io.File
import scala.io.Source
Source.fromFile(new File("myfile.txt")).getLines.foreach { line =>
// Do something with the line, for example print it
println(line)
}
वह सादे फाइल आईओ नहीं कर रहा है। वह सीएसवी आईओ कर रहा है। –
@ केन सीएसवी फाइलें आम तौर पर रेखा-उन्मुख टेक्स्ट फाइलें होती हैं, और ऊपर उनका कोड स्निपेट लाइन द्वारा टेक्स्ट फ़ाइल लाइन पढ़ने के बारे में है। मेरा जवाब वास्तव में उनके प्रश्न का सीधा जवाब नहीं है, मैं सिर्फ एक रास्ता दिखाना चाहता था जो स्कैला मुहावरे के साथ अधिक फिट बैठता है; उसका मूल कोड स्कैला में जावा मुहावरे है। – Jesper
आप एक Stream
उपयोग कर सकते हैं कि आप क्या चाहते प्राप्त करने के लिए:
Stream.continually(reader.readLine()).takeWhile(_ ne null) foreach { line =>
//do Stuff
}
यह अन्य के अतिरिक्त लाभ दिया है साथ ही कूल सामग्री:
Stream.continually(reader.readLine()).takeWhile(_ ne null) match {
case head #:: tail => //perhaps you need to do stuff with the first element?
case _ => //empty
}
संपादित - धन्यवाद ओर इशारा करते हुए के लिए mkneissl को मैं इस चेतावनी दी शामिल किया जाना चाहिए था आईएनजी:
scala> Stream.continually(1).take(100000000).foreach(x=>())
scala> val s = Stream.continually(1).take(100000000)
s: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> s.foreach(x=>()) java.lang.OutOfMemoryError: Java heap space
आप स्मृति से बाहर निकलने से बचने के लिए स्ट्रीम के सिर को न रखने के लिए चेतावनी जोड़ना चाहेंगे। बड़ी फाइलें पढ़ने पर हाल ही में इसे पकड़ा गया है। स्केला> Stream.continually (1) .take (100000000) .foreach (x =>()) ठीक है, लेकिन स्केला> वैल एस = Stream.continually (1) .take (100000000) रों : scala.collection.immutable.Stream [Int] = स्ट्रीम (1,?) स्कैला> s.foreach (x =>()) java.lang.OutOfMemoryError: जावा हीप स्पेस [बाह, टिप्पणियों में कोई स्वरूपण नहीं , पेस्टी देखें: http://paste.pocoo.org/show/226682/] – mkneissl
जब तक आपको वास्तव में स्ट्रीम की आवश्यकता न हो, तो आप Stream.continually के बजाय Iterator.continually भी उपयोग कर सकते हैं, फिर आपको स्ट्रीम के साथ समस्याओं के बारे में कोई चिंता नहीं है । –
राइट सेठ, इस सवाल का मेरा जवाब देखें: http://stackoverflow.com/questions/3062804/scala-unit-type/3063092#3063092 और स्ट्रीम बनाम इटरेटर की तुलना के लिए http://stackoverflow.com/ देखें प्रश्न/1527962/अंतर-बीच-इटरेटर-एंड-स्ट्रीम-इन-स्कैला। – mkneissl
कृपया इस उत्तर को स्वीकार न करें: जबकि सच है कि यह मूर्खतापूर्ण स्कैला नहीं है और आप जो चाहते हैं उसे प्राप्त करने के कई बेहतर तरीके हैं (नीचे मेरा उत्तर देखें) –
@oxbow_lakes, शायद आप यहां थोड़ा कठोर हो रहे हैं? जबकि कीवर्ड को कोर टीम द्वारा 2.8 मानक लाइब्रेरी में सैकड़ों बार उपयोग किया जाता है और यह उत्तर निष्पादक, संक्षिप्त और सबसे महत्वपूर्ण बात है, मेरे उत्तर की तरह दिखता है; @)) –
मैं टिप्पणी से खड़ा हूं, मुझे डर है। यह मूर्खतापूर्ण नहीं है।यह * कार्यात्मक * उत्तरों की तुलना में और भी अधिक प्रदर्शन नहीं है क्योंकि आपका कोड फ़ंक्शन (यानी ऑब्जेक्ट) तत्काल –