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?
sumber
Di scala.collection
, ada dua objek yang sangat mirip JavaConversions
dan JavaConverters
.
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 denganJavaConverters
. 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 danJavaConverters
merupakan metode yang disukai.sumber
JavaConverters
sudah usang, danscala.jdk.CollectionConverters
merupakan metode yang disukai;)Dalam Scala 2.13,
JavaConverters
telah tidak digunakan lagi karenascala.jdk.CollectionConverters
:sumber
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 menggunakanasScala
atauasJava
metode yang akan ditambahkan secara implisit ke koleksi yang ingin Anda ubah. Untuk menggunakan konverter ini, Anda perlu mengimpor:Anda harus memilih
JavaConversions
karena umumnya lebih mudah digunakan (tidak perlu menggunakanasScala
atauasJava
).sumber