にはscala.collection
、非常によく似た 2 つのオブジェクトJavaConversions
とがありJavaConverters
ます。
- これら 2 つのオブジェクトの違いは何ですか?
- なぜ両方が存在するのですか?
- どちらか一方を使用するのはいつですか?
にはscala.collection
、非常によく似た 2 つのオブジェクトJavaConversions
とがありJavaConverters
ます。
編集:Scala2.13.0でJava Conversions
入手しました。代わりにscala.jdk.CollectionConverters@deprecated
を使用してください。
JavaConversions
Javaコレクションと最も近い対応するScalaコレクションの間で変換する一連の暗黙的なメソッドを提供します。その逆も同様です。これは、Scalaインターフェースを実装して呼び出しを基になるJavaコレクションに転送するラッパー、またはJavaインターフェースを作成して呼び出しを基になるScalaコレクションに転送するラッパーを作成することによって行われます。
JavaConverters
pimp-my-libraryパターンを使用して、asScala
メソッドをJavaコレクションに「追加」し、メソッドをasJava
Scalaコレクションに「追加」します。これにより、上記で説明した適切なラッパーが返されます。これは(バージョン2.8.1以降)よりもJavaConversions
(2.8以降)新しく、ScalaとJavaコレクション間の変換を明示的にします。Davidが彼の答えに書いていることとは反対に、暗黙の変換を多く行うコードを書く可能性がはるかに低くなるので、それを使用する習慣をつけることをお勧めします。これJavaConverters
は、それが発生する唯一の場所を制御できるためです。 :あなたが書く場所.asScala
または.asJava
。
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]
ただし、Javaから直接変換を使用するには、メソッドをJavaConversions
直接呼び出すことをお勧めします。例えば:
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
Scala 2.12.x以降、この質問にたどり着いた人にとってJavaConversions
は、現在は非推奨でJavaConverters
あり、推奨される方法です。
APIで説明されているように、JavaConversions
はJavaコレクションを関連するscalaコレクションに変換する一連の暗黙的な変換です。
と一緒に使用できますimport collection.JavaConversions._
。必要に応じて、コンパイラーはjavaコレクションを適切なscala型に自動的に変換します。
JavaConverters
は、変換するコレクションに暗黙的に追加されるメソッドasScala
またはメソッドを使用して、javaまたはscalaコレクションをscalaまたはjavaコレクションに変換するのに役立つデコレータのセットです。asJava
これらのコンバーターを使用するには、以下をインポートする必要があります。
import collection.JavaConverters._
一般的に使いやすいので、お勧めします(またはJavaConversions
を使用する必要はありません)。asScala
asJava