web-dev-qa-db-ja.com

JavaコレクションをScalaコレクションに変換する

Stack Overflowの質問new HashSet(Collection)と同等のスカラに関連して、Javaコレクション(Java.util.List say)into Scala collection List

私は実際にJava API呼び出しを Spring'sSimpleJdbcTemplateに変換しようとしていますが、これはJava.util.List<T>、Scala immutable HashSetに。したがって、たとえば:

val l: Java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l

これはうまくいくようです。批判は大歓迎です!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)
86
oxbow_lakes

最後の提案は機能しますが、jcl.Bufferの使用を避けることもできます。

Set(javaApi.query(...).toArray: _*)

scala.collection.immutable.Setは、Predef.scalaのおかげでデフォルトで使用可能になっていることに注意してください。

16
Jorge Ortiz

将来の参照用:Scala 2.8では、次のように実行できます。

import scala.collection.JavaConversions._
val list = new Java.util.ArrayList[String]()
list.add("test")
val set = list.toSet

setscala.collection.immutable.Set[String] この後。

(JavaConvertersを使用した)より明示的な方法については Ben Jamesの答え も参照してください。これは現在推奨されているようです。

123
robinst

robinst's answer で示されているJavaConversionsよりも明確にしたい場合は、JavaConvertersを使用できます。

import scala.collection.JavaConverters._
val l = new Java.util.ArrayList[Java.lang.String]
val s = l.asScala.toSet
62
Ben James

JavaConversionsrobinst's answer )andJavaConvertersBen James's answerScala 2.10で非推奨になりました。

JavaConversionsの代わりに:

import scala.collection.convert.wrapAll._

aleksandr_hramcov で示唆されているとおり。

JavaConvertersの代わりに:

import scala.collection.convert.decorateAll._

どちらの場合も、変換/コンバータをJavaまたはScalaにそれぞれインポートするだけで、たとえば:

import scala.collection.convert.wrapAsScala._

更新:上記のステートメントJavaConversionsおよびJavaConverters廃止されたことが間違っているようです。 Scala 2.10に非推奨のプロパティがいくつかあり、それらのインポート時に非推奨の警告が発生しました。したがって、ここでの代替インポートはエイリアスにすぎないようです。適切な。

25
stempler

また、この優れたライブラリを調べることもできます。 scalaj-collection JavaとScalaコレクション。あなたの場合、Java.util.ListをScala Listに変換するには、次のようにします。

val list = new Java.util.ArrayList[Java.lang.String]
list.add("A")
list.add("B")
list.asScala
14
val array = Java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])
4
jamesqiu

この問題を解決する別の簡単な方法:

import collection.convert.wrapAll._
2

ToArray呼び出しに型情報を追加して、Setをパラメーター化できます。

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

これは、コレクションパッケージがScala 2.8およびscala.collection.jclパッケージが going away

2
Aaron

Javaコレクションを配列に変換してから、Scalaリストを作成できます。

val array = Java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
1
Fabian Steeg

Scala 2.13を開始し、パッケージ scala.jdk.CollectionConverters パッケージscala.collection.JavaConverters/JavaConversions._を置き換えます:

import scala.jdk.CollectionConverters._

// val javaList: Java.util.List[String] = Java.util.Arrays.asList("one","two","three")
javaList.asScala
// collection.mutable.Buffer[String] = Buffer("one", "two", "three")
javaList.asScala.toSet
// collection.immutable.Set[String] = Set("one", "two", "three")
0
Xavier Guihot