Di scala.collection, ada dua objek yang sangat mirip JavaConversionsdan JavaConverters.
- Apa perbedaan antara kedua benda ini?
- Mengapa mereka berdua ada?
- Kapan saya ingin menggunakan yang satu vs yang lain?
Di scala.collection, ada dua objek yang sangat mirip JavaConversionsdan JavaConverters.
Jawaban:
EDIT: Java Conversionsmasuk @deprecatedScala 2.13.0. Gunakan scala.jdk.CollectionConverters sebagai gantinya.
JavaConversionsmenyediakan serangkaian metode implisit yang mengkonversi antara koleksi Java dan koleksi Scala terkait terdekat, dan sebaliknya. Ini dilakukan dengan membuat pembungkus yang mengimplementasikan antarmuka Scala dan meneruskan panggilan ke koleksi Java yang mendasarinya, atau antarmuka Java, meneruskan panggilan ke koleksi Scala yang mendasarinya.
JavaConvertersmenggunakan pola mucikari perpustakaan saya untuk "menambahkan" asScalametode ke koleksi Java dan asJavametode ke koleksi Scala, yang mengembalikan pembungkus yang sesuai dibahas di atas. Ini lebih baru (sejak versi 2.8.1) daripada JavaConversions(sejak 2.8) dan membuat konversi antara koleksi Scala dan Java eksplisit. Berlawanan dengan apa yang ditulis David dalam jawabannya, saya sarankan Anda membiasakan diri untuk menggunakannya JavaConverterskarena Anda akan lebih kecil kemungkinannya untuk menulis kode yang menghasilkan banyak konversi tersirat, karena Anda dapat mengontrol satu-satunya tempat di mana hal itu akan terjadi : tempat Anda menulis .asScalaatau .asJava.
Inilah metode konversi yang JavaConvertersmenyediakan:
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]
Untuk menggunakan konversi langsung dari Jawa, Anda lebih baik memanggil metode dari JavaConversionslangsung; misalnya:
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
JavaConversionsnyaman, Anda dapat dengan cepat mengabaikan semua tempat di mana mereka dapat dimasukkan oleh kompiler. Anda mengendalikan tempat-tempat itu dengan JavaConverters. Ini adalah seluruh diskusi tentang konversi implisit vs eksplisit.
import JavaConversions._, konversi tidak akan terjadi sehingga Anda memiliki kendali atas apa yang dikonversi. Jika Anda menempatkan impor dengan cara yang benar (hanya jika diperlukan), Anda memiliki kendali penuh atas di mana konversi dilakukan.
JavaConvertersAnda memiliki keamanan tambahan yang tidak ada yang terjadi kecuali Anda menulisnya secara eksplisit. Itu keamanan tambahan, dan itulah kemungkinan besar mengapa kelas ini ditambahkan.
Bagi siapa pun yang menggunakan pertanyaan ini sejak Scala 2.12.x, JavaConversionssekarang sudah usang dan JavaConvertersmerupakan metode yang disukai.
JavaConverterssudah usang, dan scala.jdk.CollectionConvertersmerupakan metode yang disukai;)
Dalam Scala 2.13, JavaConverterstelah tidak digunakan lagi karena scala.jdk.CollectionConverters:
... paket baru
scala.jdkdengan objekCollectionConverters(koleksi Java klasik, mirip dengancollection.JavaConvertersdi 2.12)StreamConverters,,FunctionConvertersdanOptionConverters...
Sebagaimana dijelaskan dalam API, JavaConversionsadalah serangkaian konversi implisit yang mengubah koleksi java menjadi koleksi scala terkait.
Anda dapat menggunakannya dengan import collection.JavaConversions._. Bila perlu, kompiler akan secara otomatis mengubah koleksi java menjadi jenis scala yang tepat.
JavaConvertersadalah seperangkat dekorator yang membantu mengubah koleksi java atau scala ke scala atau koleksi java menggunakan asScalaatau asJavametode yang akan ditambahkan secara implisit ke koleksi yang ingin Anda ubah. Untuk menggunakan konverter ini, Anda perlu mengimpor:
import collection.JavaConverters._
Anda harus memilih JavaConversionskarena umumnya lebih mudah digunakan (tidak perlu menggunakan asScalaatau asJava).