İçinde scala.collectionçok benzer iki nesne var JavaConversionsveJavaConverters .
- Bu iki nesne arasındaki fark nedir?
- Neden ikisi de var?
- Birini diğerine ne zaman kullanmak istiyorum?
İçinde scala.collectionçok benzer iki nesne var JavaConversionsveJavaConverters .
Yanıtlar:
DÜZENLEME: Java Conversionsgot @deprecatedScala 2.13.0 yılında. Kullanım scala.jdk.CollectionConverters yerine.
JavaConversionsbir Java koleksiyonu ile en yakın karşılık gelen Scala koleksiyonu arasında dönüşüm sağlayan bir dizi örtük yöntem sağlar ve bunun tersi de geçerlidir. Bu, Scala arabirimini uygulayan ve çağrıları temel alınan Java koleksiyonuna veya Java arabirimine ileten ve çağrıları temel Scala koleksiyonuna yönlendiren sarmalayıcılar oluşturularak yapılır.
JavaConvertersasScalayöntemi Java koleksiyonlarına “eklemek” asJavave Scala koleksiyonlarına yöntemi eklemek için pimp-my-library desenini kullanır , bu da yukarıda tartışılan uygun paketleyicileri döndürür. (2.8.1'den JavaConversionsberi) ve (2.8'den beri ) daha yeni ve Scala ve Java koleksiyonu arasındaki dönüşümü açık hale getiriyor. David'in cevabında yazdıklarının aksine JavaConverters, bunun gerçekleşeceği tek noktayı kontrol edebileceğiniz için, çok fazla örtük dönüşüm yapan kod yazma olasılığınız daha düşük olacağından, bunu kullanmayı alışkanlık haline getirmenizi tavsiye ederim. : yazdığınız yer .asScalaveya .asJava.
Aşağıda sağlanan dönüştürme yöntemleri verilmiştir 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]
Bununla birlikte, dönüşümleri doğrudan Java'dan kullanmak için, yöntemleri JavaConversionsdoğrudan çağırmaktan daha iyidir ; Örneğin:
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, derleyici tarafından eklenebilecek tüm yerleri hızlı bir şekilde göz ardı edebilirsiniz. O yerleri kontrol ediyorsun JavaConverters. Örtük ve açık dönüşüm hakkında tartışma.
import JavaConversions._dönüşümler gerçekleşmeyecektir, bu nedenle neyin dönüştürüldüğünü kontrol edebilirsiniz. İçe aktarmayı doğru şekilde yerleştirirseniz (yalnızca gerektiğinde), dönüşümün yapıldığı yer üzerinde tam denetime sahip olursunuz.
JavaConvertershiçbir şeyin olmayacağı ek güvenliğiniz var. Bu ek bir güvenlik ve büyük olasılıkla bu sınıf eklendi.
Scala 2.12.x'ten beri bu soruya inen herkes JavaConversionsiçin artık kullanımdan kaldırıldı ve JavaConverterstercih edilen yöntem.
JavaConverterskullanımdan kaldırıldığı ve scala.jdk.CollectionConverterstercih edilen yöntem olduğu için;)
Scala 2.13 yılında JavaConvertersedilmiştir kaldırılmış lehine scala.jdk.CollectionConverters:
...
scala.jdknesnelerle yeni bir paketCollectionConverters(2.12'ye benzer klasik Java koleksiyonlarıcollection.JavaConverters)StreamConverters,FunctionConvertersveOptionConverters...
API'da açıklandığı gibi, JavaConversionsjava koleksiyonlarını ilgili scala koleksiyonuna dönüştüren bir dizi örtük dönüşümdür.
İle kullanabilirsiniz import collection.JavaConversions._. Gerektiğinde, derleyici otomatik olarak java koleksiyonunu doğru scala türüne dönüştürür.
JavaConvertersscala veya Java kullanarak koleksiyonlarına java veya scala koleksiyonları dönüştürmek yardımcı dekoratör kümesidir asScalaveya asJavadolaylı dönüştürmek istediğiniz bu koleksiyona eklenecek yöntemlerle. Bu dönüştürücüler kullanmak için şunları içe aktarmanız gerekir:
import collection.JavaConverters._
Sen tercih etmeliyiz JavaConversionskullanımda (sarfiyatı yoktur genellikle daha kolaydır olarak asScalaya asJava).