Di scala.collection
, ada dua objek yang sangat mirip JavaConversions
dan 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 JavaConversions
dan JavaConverters
.
Jawaban:
EDIT: Java Conversions
masuk @deprecated
Scala 2.13.0. Gunakan scala.jdk.CollectionConverters sebagai gantinya.
JavaConversions
menyediakan 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.
JavaConverters
menggunakan pola mucikari perpustakaan saya untuk "menambahkan" asScala
metode ke koleksi Java dan asJava
metode 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 JavaConverters
karena 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 .asScala
atau .asJava
.
Inilah metode konversi yang JavaConverters
menyediakan:
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 JavaConversions
langsung; 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
JavaConversions
nyaman, 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.
JavaConverters
Anda 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, JavaConversions
sekarang sudah usang dan JavaConverters
merupakan metode yang disukai.
JavaConverters
sudah usang, dan scala.jdk.CollectionConverters
merupakan metode yang disukai;)
Dalam Scala 2.13, JavaConverters
telah tidak digunakan lagi karena scala.jdk.CollectionConverters
:
... paket baru
scala.jdk
dengan objekCollectionConverters
(koleksi Java klasik, mirip dengancollection.JavaConverters
di 2.12)StreamConverters
,,FunctionConverters
danOptionConverters
...
Sebagaimana dijelaskan dalam API, JavaConversions
adalah 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.
JavaConverters
adalah seperangkat dekorator yang membantu mengubah koleksi java atau scala ke scala atau koleksi java menggunakan asScala
atau asJava
metode yang akan ditambahkan secara implisit ke koleksi yang ingin Anda ubah. Untuk menggunakan konverter ini, Anda perlu mengimpor:
import collection.JavaConverters._
Anda harus memilih JavaConversions
karena umumnya lebih mudah digunakan (tidak perlu menggunakan asScala
atau asJava
).