স্কালায় জাভা কনভার্টার্স এবং জাভা কনভার্সনের মধ্যে পার্থক্য কী?


197

ইন scala.collection, দুটি খুব অনুরূপ অবজেক্ট JavaConversionsএবং JavaConverters

  • এই দুটি বস্তুর মধ্যে পার্থক্য কী?
  • কেন তাদের উভয় অস্তিত্ব আছে?
  • আমি কখন একটি বনাম অন্যটি ব্যবহার করতে চাই?

উত্তর:


253

সম্পাদনা: স্কেল 2.13.0 এ Java Conversionsপেয়েছে got @deprecatedব্যবহার করুন scala.jdk.CollectionConverters পরিবর্তে।

JavaConversionsঅন্তর্ভুক্ত পদ্ধতিগুলির একটি সিরিজ সরবরাহ করে যা একটি জাভা সংগ্রহ এবং নিকটতম সম্পর্কিত স্কালার সংগ্রহের মধ্যে রূপান্তর করে এবং তদ্বিপরীত। এটি স্ক্র্যাপ ইন্টারফেস বাস্তবায়িত করে এবং অন্তর্নিহিত জাভা সংগ্রহ, বা জাভা ইন্টারফেসে কলগুলি অন্তর্নিহিত স্কালা সংগ্রহটিতে ফরোয়ার্ড করে এমন মোড়ক তৈরি করে তৈরি করা হয়।

JavaConvertersasScalaজাভা সংগ্রহগুলিতে asJavaপদ্ধতি এবং স্কালা সংগ্রহগুলিতে পদ্ধতিটি "যুক্ত" করতে পিম্প-মাই-লাইব্রেরি প্যাটার্ন ব্যবহার করে , যা উপরে আলোচিত উপযুক্ত মোড়ক ফিরিয়ে দেয়। এটি (২.৮.১ থেকে সংস্করণ ২.৮.১) থেকে নতুন JavaConversionsএবং স্কালা এবং জাভা সংগ্রহের মধ্যে রূপান্তরকে স্পষ্ট করে তোলে। ডেভিড তার উত্তরে যা লিখেছেন তার বিপরীতে, আমি আপনাকে এটি ব্যবহার করার অভ্যাস করার পরামর্শ দিচ্ছি 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
হ্যাঁ, জাভা কনভার্সনগুলির উপর জাভা কনভার্টার ব্যবহার করুন ,. তবে github.com/scalaj/scalaj-colલેક્ ব্যবহার করার বিষয়টি বিবেচনা করুন কারণ এটি java.util.List সেকিতে রূপান্তরিত করার কিছু সুবিধা রয়েছে। (উপরের তালিকাটি ২.৮.১ থেকে আছে?)
ওলুইজ

7
@ ডেভিড যখন সরবরাহ করেছেন JavaConversionsসেগুলির মতো অন্তর্নিহিত রূপান্তরগুলি সুবিধাজনক, আপনি সংকলক দ্বারা inোকানো যেতে পারে এমন সমস্ত জায়গাগুলি আপনি দ্রুত উপেক্ষা করতে পারেন। আপনি সেই জায়গাগুলি নিয়ন্ত্রণ করেন JavaConverters। সুস্পষ্ট রূপান্তরিত স্পষ্ট রূপান্তর সম্পর্কে এটি পুরো আলোচনা।
জিন-ফিলিপ পেলিট

1
@ জ্যান-ফিলিপপেললেট স্ক্যালায় অন্তর্নিহিত রূপান্তরগুলি স্কোপ ভিত্তিক তাই আপনি যদি না করেন তবে import JavaConversions._রূপান্তর ঘটে না তাই যা রূপান্তরিত হয় তার উপর আপনার নিয়ন্ত্রণ থাকে। আপনি যদি আমদানিটি সঠিকভাবে রাখেন (কেবলমাত্র যখন প্রয়োজন হয়), যেখানে রূপান্তরটি হয়েছে সেখানে আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকবে।
ডেভিড

2
@ ডেভিড… এবং আপনার সাথে JavaConvertersঅতিরিক্ত সুরক্ষা রয়েছে যা আপনি এটি স্পষ্টভাবে না লিখলে কিছুই ঘটে না। এটি একটি অতিরিক্ত সুরক্ষা এবং সম্ভবত এই কারণেই এই শ্রেণিটি যুক্ত হয়েছিল।
জিন-ফিলিপ পেলিট

23
আপনি মনে করেন নামকরণটি আরও ভাল হবে: উদাহরণস্বরূপ "জাভা কনভার্সনস ইম্প্লিপিক্ট" এবং "জাভা কনভার্সনস এক্সপ্লিক্ট" এর মতো কিছু আলাদা করা আরও সহজ হত।
রমন

52

স্কাল 2.12.x থেকে যে কেউ এই প্রশ্নে অবতরণ করছে, তার JavaConversionsজন্য এখন অবহেলিত এবং JavaConvertersএটি পছন্দসই পদ্ধতি।


2
যেহেতু স্কেলা ২.১13, JavaConvertersঅবচিত হ'ল, এবং scala.jdk.CollectionConvertersএটি পছন্দসই পদ্ধতি;)
এন্টোনোন

4

স্কেলা ২.১13-এ, এর পক্ষে অবচিতJavaConverters করা হয়েছে :scala.jdk.CollectionConverters

... scala.jdkঅবজেক্টস সহ নতুন প্যাকেজ CollectionConverters ( collection.JavaConverters২.১২ এর মতো ক্লাসিক জাভা সংগ্রহ ) StreamConverters, FunctionConvertersএবং OptionConverters...


3

যেমন এপিআই-তে ব্যাখ্যা করা হয়েছে, JavaConversionsএটি অন্তর্নিহিত রূপান্তরগুলির একটি সেট যা জাভা সংগ্রহগুলি সম্পর্কিত স্কেল সংগ্রহগুলিতে রূপান্তর করে।

আপনি এটি দিয়ে ব্যবহার করতে পারেন import collection.JavaConversions._। যখন প্রয়োজনীয় হবে, সংকলকটি স্বয়ংক্রিয়ভাবে জাভা সংগ্রহটি ডান স্কালার ধরণে রূপান্তর করবে।

JavaConvertersসাজসজ্জারীর একটি সেট যা জাভা বা স্কাল সংগ্রহগুলি স্কেল বা জাভা সংগ্রহগুলিতে স্কেল বা জাভা সংগ্রহগুলিতে রূপান্তর করতে সহায়তা করে asScalaবা asJavaপদ্ধতিগুলি যা আপনি যে রূপান্তর করতে চান সেই সংকলনে স্পষ্টভাবে যুক্ত হবে। এই রূপান্তরকারীগুলি ব্যবহার করার জন্য, আপনাকে আমদানি করতে হবে:

import collection.JavaConverters._

JavaConversionsএটি ব্যবহার করা সহজ হিসাবে আপনার পছন্দ করা উচিত (ব্যবহার করার প্রয়োজন নেই asScalaবা asJava)।


15
জাভা কনভার্টারের সম্পূর্ণ অন্তর্নিহিত পদ্ধতির ব্যবহার লেখার পক্ষে সহজ, তবে এটি পড়া শক্ত। বর্তমান স্কেলা শৈলীর পরামর্শ দেয় যে রূপান্তরগুলি সম্পাদন করার জন্য স্পষ্টভাবে পদ্ধতিগুলি কল করা আরও ভাল, যার কারণে এখন জাভা কনভার্টরগুলির পছন্দ হয়।
লাইফ উইকল্যান্ড

জাভা কনভার্সনগুলি স্কেলা ২.১২
আন্দ্রেজে ওস্তোস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.