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


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.


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]

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.


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]

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)

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]

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.


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
 }

0

Sejak Scala 2.12.0 JavaConversions tidak digunakan lagi.

Jadi solusi paling sederhana bagi saya adalah:

java.util.Arrays.asList("a","b","c")

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.