に変換するJavaコレクション、Scalaの収集
-
21-08-2019 - |
質問
関係スタックオーバーフロー問題 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.Set
がPredef.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._
更新: の計算書上 JavaConversions や JavaConverters が推奨されていませんが間違っています。が推奨されていませんの物件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")