İçinde scala.collection
çok benzer iki nesne var JavaConversions
veJavaConverters
.
- 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 JavaConversions
veJavaConverters
.
Yanıtlar:
DÜZENLEME: Java Conversions
got @deprecated
Scala 2.13.0 yılında. Kullanım scala.jdk.CollectionConverters yerine.
JavaConversions
bir 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.
JavaConverters
asScala
yöntemi Java koleksiyonlarına “eklemek” asJava
ve 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 JavaConversions
beri) 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 .asScala
veya .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 JavaConversions
doğ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.
JavaConverters
hiç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 JavaConversions
için artık kullanımdan kaldırıldı ve JavaConverters
tercih edilen yöntem.
JavaConverters
kullanımdan kaldırıldığı ve scala.jdk.CollectionConverters
tercih edilen yöntem olduğu için;)
Scala 2.13 yılında JavaConverters
edilmiştir kaldırılmış lehine scala.jdk.CollectionConverters
:
...
scala.jdk
nesnelerle yeni bir paketCollectionConverters
(2.12'ye benzer klasik Java koleksiyonlarıcollection.JavaConverters
)StreamConverters
,FunctionConverters
veOptionConverters
...
API'da açıklandığı gibi, JavaConversions
java 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.
JavaConverters
scala veya Java kullanarak koleksiyonlarına java veya scala koleksiyonları dönüştürmek yardımcı dekoratör kümesidir asScala
veya asJava
dolaylı 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 JavaConversions
kullanımda (sarfiyatı yoktur genellikle daha kolaydır olarak asScala
ya asJava
).