90

スタック オーバーフローの質問Scala と同等の new HashSet(Collection)java.util.Listに関連して、Java コレクション (たとえば) を Scala コレクションに変換するにはどうすればよいListですか?

私は実際に Java API 呼び出しをSpring の SimpleJdbcTemplateに変換しようとしています。これは a を返し、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( ... ) ) : _ *)
4

10 に答える 10

127

今後の参考のために: Scala 2.8 では、次のように実行できます。

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

setこの後ですscala.collection.immutable.Set[String]

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

于 2010-10-19T14:49:48.777 に答える
62

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

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
于 2011-06-15T11:11:21.677 に答える
25

JavaConversions ( robinst の回答) とJavaConverters ( Ben James の回答) は、 Scala 2.10で非推奨になりました。

JavaConversionsの代わりに以下を使用します。

import scala.collection.convert.wrapAll._

aleksandr_hramcovが示唆するように。

JavaConvertersの代わりに以下を使用します。

import scala.collection.convert.decorateAll._

どちらの場合も、変換/コンバーターをそれぞれ Java または Scala にのみインポートする可能性もあります。次に例を示します。

import scala.collection.convert.wrapAsScala._

更新: JavaConversionsJavaConvertersが非推奨 であるという上記のステートメントは間違っているようです。Scala 2.10 には非推奨のプロパティがいくつかあり、インポート時に非推奨の警告が表示されました。したがって、ここでの代替インポートは単なるエイリアスのようです。私はまだそれらを好みますが、私見としては名前の方が適切です。

于 2014-08-18T08:52:38.550 に答える
17

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

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

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

于 2009-03-24T07:51:54.863 に答える
14

また、この優れたライブラリーである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
于 2010-05-12T18:47:30.567 に答える
3
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])
于 2010-10-08T07:26:00.743 に答える
2

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

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

これは、コレクション パッケージが Scala 2.8 の大幅なリワークを経ており、scala.collection.jcl パッケージがなくなるため、望ましいかもしれません。

于 2010-03-23T19:43:10.817 に答える
1

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

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
于 2009-03-23T18:50:03.340 に答える