Scala'daki JavaConverters ve JavaConversions arasındaki fark nedir?


Yanıtlar:


253

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

5
Evet, JavaConversions üzerinden JavaConverters kullanın. Ancak , java.util.List dosyasını Seq'e dönüştürmenin bazı faydaları olduğu için github.com/scalaj/scalaj-collection kullanmayı da düşünün . (Yukarıdaki liste
2.8.1'den

7
@David Sağlananlar gibi örtük dönüşümler uygun olsa da 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.
Jean-Philippe Pellet

1
@ Jean-PhilippePellet Scala'daki örtük dönüşümler Kapsam tabanlıdır, bu nedenle değiştirmezseniz 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.
David

2
@David… ve açık bir şekilde yazmadıkça 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.
Jean-Philippe Pellet

23
Adlandırmanın daha iyi olacağını düşünürdünüz: örneğin "JavaConversionsImplicit" ve "JavaConversionsExplicit" gibi bir şeyi ayırt etmek daha kolay olurdu.
Raman

52

Scala 2.12.x'ten beri bu soruya inen herkes JavaConversionsiçin artık kullanımdan kaldırıldı ve JavaConverterstercih edilen yöntem.


2
Scala 2.13, JavaConverterskullanımdan kaldırıldığı ve scala.jdk.CollectionConverterstercih edilen yöntem olduğu için;)
antonone

4

Scala 2.13 yılında JavaConvertersedilmiştir kaldırılmış lehine scala.jdk.CollectionConverters:

... scala.jdknesnelerle yeni bir paket CollectionConverters (2.12'ye benzer klasik Java koleksiyonları collection.JavaConverters) StreamConverters, FunctionConvertersve OptionConverters...


3

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).


15
JavaConverters'ın tamamen örtülü yaklaşımını yazmak daha kolayken, okunması daha zordur. Mevcut Scala stili, dönüşümleri gerçekleştirmek için yöntemleri açıkça çağırmanın daha iyi olduğunu öne sürüyor, bu yüzden JavaConverters artık tercih ediliyor.
Leif Wickland

JavaConversions Scala 2.12
Andrzej Wąsowski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.