Terkait dengan pertanyaan Stack Overflow, Scala setara dengan HashSet (Koleksi) baru , bagaimana cara mengonversi koleksi Java ( java.util.List
katakanlah) menjadi koleksi Scala List
?
Saya sebenarnya mencoba untuk mengubah panggilan API Java ke Spring SimpleJdbcTemplate
, yang mengembalikan java.util.List<T>
, menjadi Scala yang tidak dapat diubah HashSet
. Jadi contohnya:
val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l
Sepertinya ini berhasil. Kritik diterima!
import scala.collection.immutable.Set
import scala.collection.jcl.Buffer
val s: scala.collection.Set[String] =
Set(Buffer(javaApi.query( ... ) ) : _ *)
java
scala
scala-collections
scala-2.7
oxbow_lakes
sumber
sumber
Untuk referensi di masa mendatang: Dengan Scala 2.8, dapat dilakukan seperti ini:
import scala.collection.JavaConversions._ val list = new java.util.ArrayList[String]() list.add("test") val set = list.toSet
set
adalahscala.collection.immutable.Set[String]
setelah ini.Juga lihat jawaban Ben James untuk cara yang lebih eksplisit (menggunakan JavaConverters), yang sepertinya direkomendasikan sekarang.
sumber
JavaConversions
memiliki beberapa implikasi membuattoSet
panggilan tidak perlu.Jika Anda ingin lebih eksplisit daripada JavaConversions yang ditunjukkan dalam jawaban robinst , Anda dapat menggunakan JavaConverters:
import scala.collection.JavaConverters._ val l = new java.util.ArrayList[java.lang.String] val s = l.asScala.toSet
sumber
JavaConversions ( jawaban robinst ) dan JavaConverters ( jawaban Ben James ) tidak lagi digunakan dengan Scala 2.10 .
Sebagai ganti penggunaan JavaConversions :
import scala.collection.convert.wrapAll._
seperti yang disarankan oleh aleksandr_hramcov .
Sebagai ganti penggunaan JavaConverters :
import scala.collection.convert.decorateAll._
Untuk keduanya juga ada kemungkinan untuk hanya mengimpor konversi / konverter ke Java atau Scala, misalnya:
import scala.collection.convert.wrapAsScala._
Pembaruan: Pernyataan di atas bahwa JavaConversions dan JavaConverters sudah tidak digunakan lagi tampaknya salah. Ada beberapa properti yang tidak digunakan lagi di Scala 2.10, yang mengakibatkan peringatan penghentian saat mengimpornya. Jadi impor alternatif di sini sepertinya hanya alias. Padahal saya masih lebih suka mereka, karena IMHO namanya lebih sesuai.
sumber
Anda mungkin juga ingin menjelajahi perpustakaan luar biasa ini: koleksi scalaj yang memiliki konversi dua arah antara koleksi Java dan Scala. Dalam kasus Anda, untuk mengonversi daftar java.util.List ke Daftar Scala, Anda dapat melakukan ini:
val list = new java.util.ArrayList[java.lang.String] list.add("A") list.add("B") list.asScala
sumber
Memulai
Scala 2.13
, paketscala.jdk.CollectionConverters
menggantikan paketscala.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")
sumber
val array = java.util.Arrays.asList("one","two","three").toArray val list = array.toList.map(_.asInstanceOf[String])
sumber
Anda dapat menambahkan informasi tipe dalam panggilan toArray untuk membuat Set menjadi parameter:
val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)
Ini mungkin lebih disukai karena paket koleksi akan melalui pengerjaan ulang besar untuk Scala 2.8 dan paket scala.collection.jcl akan ditiadakan
sumber
Anda bisa mengonversi koleksi Java ke array dan kemudian membuat daftar Scala dari itu:
val array = java.util.Arrays.asList("one","two","three").toArray val list = List.fromArray(array)
sumber
Cara sederhana lain untuk mengatasi masalah ini:
import collection.convert.wrapAll._
sumber