में scala.collection
, दो बहुत समान वस्तुएं हैं JavaConversions
और JavaConverters
।
- इन दोनों वस्तुओं में क्या अंतर है?
- वे दोनों क्यों मौजूद हैं?
- मैं एक बनाम दूसरे का उपयोग कब करना चाहता हूं?
में scala.collection
, दो बहुत समान वस्तुएं हैं JavaConversions
और JavaConverters
।
जवाबों:
EDIT: स्केल 2.13.0 में Java Conversions
मिला @deprecated
। इसके बजाय scala.jdk.CollectionConverters का उपयोग करें ।
JavaConversions
निहित तरीकों की एक श्रृंखला प्रदान करते हैं जो जावा संग्रह और निकटतम संगत स्काला संग्रह और इसके विपरीत में परिवर्तित होते हैं। यह रैपर बनाने के द्वारा किया जाता है जो या तो स्काला इंटरफेस को लागू करता है और कॉल को अंतर्निहित जावा संग्रह या जावा इंटरफेस के लिए कॉल करता है, कॉल को अंतर्निहित स्काला संग्रह में अग्रेषित करता है।
JavaConverters
asScala
जावा संग्रह और asJava
स्केला संग्रह के लिए विधि को "जोड़ने" के लिए पिंप-माय-लाइब्रेरी पैटर्न का उपयोग करता है , जो ऊपर चर्चा किए गए उचित रैपर को वापस करता है। यह JavaConversions
2.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.JavaConverters
2.12 में समान )StreamConverters
,FunctionConverters
औरOptionConverters
...
जैसा कि एपीआई में बताया गया है, JavaConversions
निहित रूपांतरण का एक सेट है जो जावा संग्रह को संबंधित स्कैला संग्रह में बदल देता है।
आप इसे एक के साथ उपयोग कर सकते हैं import collection.JavaConversions._
। जब आवश्यक हो, संकलक स्वचालित रूप से जावा संग्रह को सही स्केला प्रकार में बदल देगा।
JavaConverters
डेकोरेटर का एक सेट है जो जावा या स्कैला कलेक्शन को स्कैला या जावा कलेक्शंस में बदलने में मदद करता है asScala
या ऐसे asJava
तरीकों का उपयोग किया जाता है जिन्हें उस कलेक्शन में जोड़ा जाता है जिसे आप ट्रांसफॉर्म करना चाहते हैं। इन कन्वर्टर्स का उपयोग करने के लिए, आपको आयात करने की आवश्यकता है:
import collection.JavaConverters._
आप पसंद करते हैं चाहिए JavaConversions
के रूप में यह आम तौर पर उपयोग (उपयोग करने की आवश्यकता करने के लिए आसान है asScala
या asJava
)।