204

にはscala.collection、非常によく似た 2 つのオブジェクトJavaConversionsとがありJavaConvertersます。

  • これら 2 つのオブジェクトの違いは何ですか?
  • なぜ両方が存在するのですか?
  • どちらか一方を使用するのはいつですか?
4

4 に答える 4

263

編集:Scala2.13.0でJava Conversions入手しました。代わりにscala.jdk.CollectionConverters@deprecatedを使用してください。

JavaConversionsJavaコレクションと最も近い対応するScalaコレクションの間で変換する一連の暗黙的なメソッドを提供します。その逆も同様です。これは、Scalaインターフェースを実装して呼び出しを基になるJavaコレクションに転送するラッパー、またはJavaインターフェースを作成して呼び出しを基になるScalaコレクションに転送するラッパーを作成することによって行われます。

JavaConverterspimp-my-libraryパターンを使用して、asScalaメソッドをJavaコレクションに「追加」し、メソッドをasJavaScalaコレクションに「追加」します。これにより、上記で説明した適切なラッパーが返されます。これは(バージョン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
于 2011-11-28T21:21:36.227 に答える
54

Scala 2.12.x以降、この質問にたどり着いた人にとってJavaConversionsは、現在は非推奨でJavaConvertersあり、推奨される方法です。

于 2017-01-18T14:11:36.310 に答える
3

APIで説明されているように、JavaConversionsはJavaコレクションを関連するscalaコレクションに変換する一連の暗黙的な変換です。

と一緒に使用できますimport collection.JavaConversions._。必要に応じて、コンパイラーはjavaコレクションを適切なscala型に自動的に変換します。

JavaConvertersは、変換するコレクションに暗黙的に追加されるメソッドasScalaまたはメソッドを使用して、javaまたはscalaコレクションをscalaまたはjavaコレクションに変換するのに役立つデコレータのセットです。asJavaこれらのコンバーターを使用するには、以下をインポートする必要があります。

import collection.JavaConverters._

一般的に使いやすいので、お勧めします(またはJavaConversionsを使用する必要はありません)。asScalaasJava

于 2011-11-28T21:17:03.467 に答える