में scala.collection, दो बहुत समान वस्तुएं हैं JavaConversionsऔर JavaConverters।
- इन दोनों वस्तुओं में क्या अंतर है?
- वे दोनों क्यों मौजूद हैं?
- मैं एक बनाम दूसरे का उपयोग कब करना चाहता हूं?
में scala.collection, दो बहुत समान वस्तुएं हैं JavaConversionsऔर JavaConverters।
जवाबों:
EDIT: स्केल 2.13.0 में Java Conversionsमिला @deprecated। इसके बजाय scala.jdk.CollectionConverters का उपयोग करें ।
JavaConversionsनिहित तरीकों की एक श्रृंखला प्रदान करते हैं जो जावा संग्रह और निकटतम संगत स्काला संग्रह और इसके विपरीत में परिवर्तित होते हैं। यह रैपर बनाने के द्वारा किया जाता है जो या तो स्काला इंटरफेस को लागू करता है और कॉल को अंतर्निहित जावा संग्रह या जावा इंटरफेस के लिए कॉल करता है, कॉल को अंतर्निहित स्काला संग्रह में अग्रेषित करता है।
JavaConvertersasScalaजावा संग्रह और asJavaस्केला संग्रह के लिए विधि को "जोड़ने" के लिए पिंप-माय-लाइब्रेरी पैटर्न का उपयोग करता है , जो ऊपर चर्चा किए गए उचित रैपर को वापस करता है। यह JavaConversions2.8 के बाद से ( संस्करण 2.8.1 से) नया है और स्काला और जावा संग्रह के बीच रूपांतरण को स्पष्ट करता है। डेविड ने अपने उत्तर में जो लिखा है, उसके विपरीत, मैं आपको इसे उपयोग करने की आदत बनाने की सलाह दूंगा, JavaConvertersक्योंकि आपको कोड लिखने की संभावना बहुत कम होगी, जो बहुत सारे निहितार्थ बनाता है, क्योंकि आप केवल उसी स्थान को नियंत्रित कर सकते हैं जहां यह होगा : आप लिखते हैं जहां .asScalaया .asJava।
यहां रूपांतरण विधियां JavaConvertersप्रदान की गई हैं:
Pimped Type | Conversion Method | Returned Type
=================================================================================================
scala.collection.Iterator | asJava | java.util.Iterator
scala.collection.Iterator | asJavaEnumeration | java.util.Enumeration
scala.collection.Iterable | asJava | java.lang.Iterable
scala.collection.Iterable | asJavaCollection | java.util.Collection
scala.collection.mutable.Buffer | asJava | java.util.List
scala.collection.mutable.Seq | asJava | java.util.List
scala.collection.Seq | asJava | java.util.List
scala.collection.mutable.Set | asJava | java.util.Set
scala.collection.Set | asJava | java.util.Set
scala.collection.mutable.Map | asJava | java.util.Map
scala.collection.Map | asJava | java.util.Map
scala.collection.mutable.Map | asJavaDictionary | java.util.Dictionary
scala.collection.mutable.ConcurrentMap | asJavaConcurrentMap | java.util.concurrent.ConcurrentMap
—————————————————————————————————————————————————————————————————————————————————————————————————
java.util.Iterator | asScala | scala.collection.Iterator
java.util.Enumeration | asScala | scala.collection.Iterator
java.lang.Iterable | asScala | scala.collection.Iterable
java.util.Collection | asScala | scala.collection.Iterable
java.util.List | asScala | scala.collection.mutable.Buffer
java.util.Set | asScala | scala.collection.mutable.Set
java.util.Map | asScala | scala.collection.mutable.Map
java.util.concurrent.ConcurrentMap | asScala | scala.collection.mutable.ConcurrentMap
java.util.Dictionary | asScala | scala.collection.mutable.Map
java.util.Properties | asScala | scala.collection.mutable.Map[String, String]
जावा से सीधे रूपांतरणों का उपयोग करने के लिए, हालांकि, आप JavaConversionsसीधे कॉल करने के तरीकों से बेहतर हैं; उदाहरण के लिए:
List<String> javaList = new ArrayList<String>(Arrays.asList("a", "b", "c"));
System.out.println(javaList); // [a, b, c]
Buffer<String> scalaBuffer = JavaConversions.asScalaBuffer(javaList);
System.out.println(scalaBuffer); // Buffer(a, b, c)
List<String> javaListAgain = JavaConversions.bufferAsJavaList(scalaBuffer);
System.out.println(javaList == javaListAgain); // true
JavaConversionsकि सुविधाजनक हैं, आप जल्दी से उन सभी स्थानों की अनदेखी कर सकते हैं, जहां उन्हें कंपाइलर द्वारा डाला जा सकता है। आप उन स्थानों को नियंत्रित करते हैं JavaConverters। यह संपूर्ण बनाम स्पष्ट रूपांतरण के बारे में पूरी चर्चा है।
import JavaConversions._, तो रूपांतरण नहीं होगा, इसलिए आपके पास परिवर्तित होने पर नियंत्रण है। यदि आप आयात को सही तरीके से रखते हैं (केवल जब जरूरत होती है), तो रूपांतरण पूरा होने पर आपका पूरा नियंत्रण होता है।
JavaConvertersआपके पास अतिरिक्त सुरक्षा है जो तब तक कुछ नहीं होता जब तक आप इसे स्पष्ट रूप से नहीं लिखते। यह एक अतिरिक्त सुरक्षा है, और शायद यही कारण है कि इस वर्ग को जोड़ा गया है।
स्केल 2.13 में, के पक्ष JavaConvertersमें पदावनत किया गया है scala.jdk.CollectionConverters:
...
scala.jdkवस्तुओं के साथ नया पैकेजCollectionConverters(क्लासिक जावा संग्रह,collection.JavaConverters2.12 में समान )StreamConverters,FunctionConvertersऔरOptionConverters...
जैसा कि एपीआई में बताया गया है, JavaConversionsनिहित रूपांतरण का एक सेट है जो जावा संग्रह को संबंधित स्कैला संग्रह में बदल देता है।
आप इसे एक के साथ उपयोग कर सकते हैं import collection.JavaConversions._। जब आवश्यक हो, संकलक स्वचालित रूप से जावा संग्रह को सही स्केला प्रकार में बदल देगा।
JavaConvertersडेकोरेटर का एक सेट है जो जावा या स्कैला कलेक्शन को स्कैला या जावा कलेक्शंस में बदलने में मदद करता है asScalaया ऐसे asJavaतरीकों का उपयोग किया जाता है जिन्हें उस कलेक्शन में जोड़ा जाता है जिसे आप ट्रांसफॉर्म करना चाहते हैं। इन कन्वर्टर्स का उपयोग करने के लिए, आपको आयात करने की आवश्यकता है:
import collection.JavaConverters._
आप पसंद करते हैं चाहिए JavaConversionsके रूप में यह आम तौर पर उपयोग (उपयोग करने की आवश्यकता करने के लिए आसान है asScalaया asJava)।