質問

関係スタックオーバーフロー問題 Scala相当の新HashSet(Collection) , 、どうやって変換し、Javaコレクション(java.util.List と言う)Scalaの収集 List?

私は実際に変換するJava APIの呼び出 春の SimpleJdbcTemplate, 返す java.util.List<T>, に、Scala不変なので 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( ... ) ) : _ *)
役に立ちましたか?

解決

あなたの最後の提案は動作しますが、あなたはまた、jcl.Bufferを使用して回避することができます:

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

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

他のヒント

今後の参考のために: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を使用して)、。

あなたはJavaConversionsは robinstの中で示されたよりも、より明確になりたい場合はに答え、あなたがJavaConvertersを使用することができます:

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet

JavaConversions (robinstの回答JavaConverters (ベンジェームズの答え して推奨されていません付 Scala2.10.

の代わりに JavaConversions 用途:

import scala.collection.convert.wrapAll._

このように aleksandr_hramcov.

の代わりに JavaConverters 用途:

import scala.collection.convert.decorateAll._

の両方をする可能性もあるためインポートのみ変換/コンバータをJavaまたはスカラがそれぞれ、例えば:

import scala.collection.convert.wrapAsScala._

更新: の計算書上 JavaConversionsJavaConverters が推奨されていませんが間違っています。が推奨されていませんの物件Scala2.10た却ときに警告を輸入します。の代替輸入はこちらかだけを別名になります。いだし、厚の名前は適しています。

また、この優れたライブラリーを探索することもできます。双方向を持っている scalaj収集する JavaとScalaのコレクションの間の変換。

:あなたのケースでは、Scalaのリストへのjava.util.Listを変換するために、あなたはこれを行うことができます
val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
val array = java.util.Arrays.asList("one","two","three").toArray

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

を追加できるタイプの情報をtoArray通話設定するパラメータ:

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

これまでのとして好ましいコレクションにパッケージは大きなリワークのためのスカラ2.8のscala.収集します。jclのパッケージには 花と笑顔が広まれば幸い

この問題を解決するためのもう一つの簡単な方法:

import collection.convert.wrapAll._

あなたは、アレイへのJavaコレクションを変換し、そのからScalaのリストを作成することができます:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)

開始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")
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top