स्केल में JavaConverters और JavaConversions के बीच अंतर क्या है?


197

में scala.collection, दो बहुत समान वस्तुएं हैं JavaConversionsऔर JavaConverters

  • इन दोनों वस्तुओं में क्या अंतर है?
  • वे दोनों क्यों मौजूद हैं?
  • मैं एक बनाम दूसरे का उपयोग कब करना चाहता हूं?

जवाबों:


253

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

5
हाँ, JavaConversions पर JavaConverters का उपयोग करें,। लेकिन github.com/scalaj/scalaj-collection का उपयोग करने पर भी विचार करें क्योंकि इसमें java.util को परिवर्तित करने के कुछ लाभ हैं। Seq पर जाएं। (उपरोक्त सूची
२. above.१.१

7
@ दाविद के द्वारा प्रदान किए गए रूपांतरण जैसे JavaConversionsकि सुविधाजनक हैं, आप जल्दी से उन सभी स्थानों की अनदेखी कर सकते हैं, जहां उन्हें कंपाइलर द्वारा डाला जा सकता है। आप उन स्थानों को नियंत्रित करते हैं JavaConverters। यह संपूर्ण बनाम स्पष्ट रूपांतरण के बारे में पूरी चर्चा है।
जीन-फिलिप पेलेट

1
@ स्कैला में जीन-फिलीपेललेट निहितार्थ रूपांतरण स्कोप आधारित हैं, इसलिए यदि आप नहीं करते हैं import JavaConversions._, तो रूपांतरण नहीं होगा, इसलिए आपके पास परिवर्तित होने पर नियंत्रण है। यदि आप आयात को सही तरीके से रखते हैं (केवल जब जरूरत होती है), तो रूपांतरण पूरा होने पर आपका पूरा नियंत्रण होता है।
डेविड

2
@ डेविड ... और JavaConvertersआपके पास अतिरिक्त सुरक्षा है जो तब तक कुछ नहीं होता जब तक आप इसे स्पष्ट रूप से नहीं लिखते। यह एक अतिरिक्त सुरक्षा है, और शायद यही कारण है कि इस वर्ग को जोड़ा गया है।
जीन-फिलिप पेलेट

23
आपको लगता है कि नामकरण बेहतर होगा: उदाहरण के लिए "JavaConversionsImplicit" और "JavaConversionsExplicit" कुछ अलग करना आसान होगा।
रमन

52

स्कैला 2.12.x के बाद से इस प्रश्न पर उतरने वाले किसी भी व्यक्ति के लिए JavaConversionsअब पदावनत किया जाता है और JavaConvertersयह पसंदीदा तरीका है।


2
JavaConvertersscala.jdk.CollectionConverters
स्कैला

4

स्केल 2.13 में, के पक्ष JavaConvertersमें पदावनत किया गया है scala.jdk.CollectionConverters:

... scala.jdkवस्तुओं के साथ नया पैकेज CollectionConverters (क्लासिक जावा संग्रह, collection.JavaConverters2.12 में समान ) StreamConverters, FunctionConvertersऔर OptionConverters...


3

जैसा कि एपीआई में बताया गया है, JavaConversionsनिहित रूपांतरण का एक सेट है जो जावा संग्रह को संबंधित स्कैला संग्रह में बदल देता है।

आप इसे एक के साथ उपयोग कर सकते हैं import collection.JavaConversions._। जब आवश्यक हो, संकलक स्वचालित रूप से जावा संग्रह को सही स्केला प्रकार में बदल देगा।

JavaConvertersडेकोरेटर का एक सेट है जो जावा या स्कैला कलेक्शन को स्कैला या जावा कलेक्शंस में बदलने में मदद करता है asScalaया ऐसे asJavaतरीकों का उपयोग किया जाता है जिन्हें उस कलेक्शन में जोड़ा जाता है जिसे आप ट्रांसफॉर्म करना चाहते हैं। इन कन्वर्टर्स का उपयोग करने के लिए, आपको आयात करने की आवश्यकता है:

import collection.JavaConverters._

आप पसंद करते हैं चाहिए JavaConversionsके रूप में यह आम तौर पर उपयोग (उपयोग करने की आवश्यकता करने के लिए आसान है asScalaया asJava)।


15
JavaConverters के पूरी तरह से निहित दृष्टिकोण का उपयोग करते हुए लिखना आसान है, यह पढ़ना मुश्किल है। वर्तमान स्काला शैली से पता चलता है कि रूपांतरण करने के लिए स्पष्ट रूप से कॉल करने के तरीके बेहतर हैं, यही कारण है कि अब जावाकॉनवर्टर को प्राथमिकता दी जाती है।
बजे लीफ विकलैंड

JavaConversions को Scala 2.12 में चित्रित किया गया है
Andrzej Wowssowski
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.