Bagaimana cara mengonversi scala.List menjadi java.util.List?

112

Bagaimana cara mengubah Scala scala.Listmenjadi Java java.util.List?

Alex Baranosky
sumber
3
Bung ... ubah jawaban yang diterima ... (tolong)
sfletche

Jawaban:

69

Daftar Scala dan Daftar Jawa adalah dua binatang yang berbeda, karena yang pertama tidak dapat diubah dan yang terakhir dapat berubah. Jadi, untuk berpindah dari satu sama lain, Anda harus terlebih dahulu mengubah Daftar Scala menjadi koleksi yang bisa diubah.

Di Scala 2.7:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

Dari Scala 2.8 dan seterusnya:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
asList(ListBuffer(List(1,2,3): _*))
val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*)

Namun, asListdalam contoh tersebut tidak diperlukan jika jenis yang diharapkan adalah Java List, karena konversinya bersifat implisit, seperti yang ditunjukkan oleh baris terakhir.

Daniel C. Sobral
sumber
Val x: java.util.List [Int] masih tetap. Coba saja di Java ke x.add (sesuatu) - itu akan membuat kesalahan
Vitamon
1
@Vitamon Tidak ada kesalahan untuk saya - Saya baru saja mengujinya untuk mengonfirmasi.
Daniel C. Sobral
4
Tidak digunakan lagi mendukung scala.collection.JavaConvertersdari 2.12 pada
Jeroen Kransen
untuk 2.12.1, ketika segera melakukan iterasi pada Daftar Java dengan Scala for loop, saya lebih beruntung menggunakan asScalaBuffer () dalam paket JavaConverters
Sarah Messer
165

Tidak yakin mengapa ini belum disebutkan sebelumnya, tetapi menurut saya cara yang paling intuitif adalah dengan memanggil asJavametode dekorator JavaConverters langsung di daftar Scala:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]
dimitrisli
sumber
6
Ini juga mengharuskan Anda untuk menjadi eksplisit daripada bergantung pada beberapa sihir implisit yang mungkin tidak diinginkan suatu saat.
Kamil Lelonek
Hal ini menyebabkan masalah jika menserialisasi daftar untuk penggunaan selanjutnya dalam kode Java ... ini menghasilkan ClassNotFoundException: scala.collection.convert.Wrappers. Arrays.asList (foo: _ *) berfungsi dalam kasus ini.
Mohan
Saya membuka halaman ini setiap kali saya perlu menggunakan Java di Scala. Sayangnya tidak ada ide yang menyarankan saya saran impor yang tepat untuk ".asJava" ((
mulya
24

Untuk meringkas jawaban sebelumnya

Dengan asumsi kami memiliki yang berikut List:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

Jika Anda ingin lebih eksplisit dan mengatakan dengan tepat apa yang ingin Anda ubah:

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

Jika Anda tidak ingin mengontrol konversi bersama dan membiarkan compiler membuat pekerjaan implisit untuk Anda:

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val javaList: java.util.List[Int] = scalaList
javaList: java.util.List[Int] = [1, 2, 3]

Terserah Anda bagaimana Anda ingin mengontrol kode Anda.

Kamil Lelonek
sumber
8

Memulai Scala 2.13, paket scala.jdk.CollectionConvertersmenyediakan asJavamelalui germo Seqdan mengganti paket scala.collection.JavaConverters/JavaConversions:

import scala.jdk.CollectionConverters._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]
Xavier Guihot
sumber
7

Pertanyaan yang cukup lama, meskipun saya akan menjawab, diberikan tetapi sebagian besar saran sudah usang.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
Shirish Kumar
sumber
object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
prayagupd
5

Memperbarui

dengan skala 2.9.2:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )

hasil

[1, 2, 3]
Guillaume Massé
sumber
1

Untuk pemanggilan tunggal, melakukannya dengan tangan mungkin merupakan solusi paling sederhana:

val slist = List (1, 2, 3, 4)          
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

Saya tidak mengukur kinerja.

Stefan W.
sumber
0

Hanya melakukan seperti yang diusulkan di atas menghasilkan daftar yang tidak dapat diubah bahkan di sisi Java. Satu-satunya solusi yang berfungsi yang saya temukan adalah ini:

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }
Vitamon
sumber
0

Sejak Scala 2.12.0 JavaConversions tidak digunakan lagi.

Jadi solusi paling sederhana bagi saya adalah:

java.util.Arrays.asList("a","b","c")
elarib
sumber
1
Jawaban ini tidak menjelaskan bagaimana menggunakan ini untuk mengubah daftar skala menjadi daftar java. Arrays.asList juga bisa bermasalah karena mengembalikan Arrays.ArrayList yang bukan Daftar yang dapat diubah ukurannya yang dapat menyebabkan beberapa kesalahan tak terduga jika Anda merasa memiliki util.ArrayList.
puhlen
1
Benar adanya deprecation, ada import scala.collection.JavaConverters._untuk 2.12.4
prayagupd