Bagaimana cara mendapatkan Daftar Scala dari Daftar Java?

133

Saya memiliki API Java yang mengembalikan Daftar seperti:

public List<?> getByXPath(String xpathExpr)

Saya menggunakan kode scala di bawah ini:

val lst = node.getByXPath(xpath)

Sekarang jika saya mencoba scala sintaks gula seperti:

lst.foreach{ node => ... }

tidak bekerja. Saya mendapatkan kesalahan:

value foreach is not a member of java.util.List[?0]

Sepertinya saya perlu mengonversi Java List ke Scala List. Bagaimana melakukannya dalam konteks di atas?

kartu as
sumber
2
kemungkinan duplikat dari Mengonversi koleksi Java ke dalam koleksi Scala
Kim Stebel
@ Kim: Saya tidak yakin pantas menutup ini sebagai duplikat dari pertanyaan khusus itu - pertanyaan khusus itu berbicara tentang Scala 2.7, dan paket scala.collection.jcl tidak ada lagi di Scala 2.8 dan 2.9.
Ken Bloom

Jawaban:

177

EDIT: Perhatikan bahwa ini sudah usang sejak 2.12.0. Gunakan JavaConverterssebagai gantinya. (komentar oleh @Yaroslav)

Sejak Scala 2.8 konversi ini sekarang dibangun ke dalam bahasa menggunakan:

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

bekerja. asScalatidak bekerja

kartu as
sumber
13
Pada 2.10.4 saya harus mengimpor scala.collection.JavaConverters._ kalau tidak saya mendapat "nilai asScala bukan anggota java.util.List [String]"
dranxo
11
JavaConversionssudah ditinggalkan sejak 2.12.0. Gunakan JavaConverterssebagai gantinya.
Yaroslav
4
Untuk 2.13.x, Anda perlu import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou
92

Ada objek Scala yang berguna hanya untuk ini - scala.collection.JavaConverters

Anda dapat melakukan impor dan asScalasesudahnya sebagai berikut:

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

Ini akan memberi Anda Bufferrepresentasi Scala yang memungkinkan Anda untuk melakukannya foreach.

montreal.eric
sumber
7
JavaConverters harus lebih disukai daripada JavaConversions karena itu membuat konversi eksplisit (dan menghindari konversi yang tidak disengaja yang mungkin membingungkan). (Yaitu, ini adalah jawaban yang benar)
Mark
sejak scala 2.13 kelas ini sudah usang juga. Gunakan scala.jdk.CollectionConverters sebagai gantinya.
dev-null
9

Saya mencari jawaban yang ditulis di Jawa dan secara mengejutkan tidak menemukan solusi bersih di sini. Setelah beberapa saat saya bisa mengetahuinya jadi saya memutuskan untuk menambahkannya di sini kalau-kalau ada orang lain yang mencari implementasi Java (saya kira itu juga berfungsi di Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()
Akar
sumber
9

Jika Anda harus mengonversi Java List<ClassA>ke Scala List[ClassB], maka Anda harus melakukan hal berikut:

1) Tambahkan

import scala.collection.JavaConverters._

2) Gunakan metode asScala, toListlalumap

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))

3) Tambahkan yang berikut ke ClassBkonstruktor yang menerima ClassAsebagai parameter:

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}
Leandro carrasco
sumber
6

Karena scala 2.8.1 digunakan JavaConverters._ untuk mengkonversi koleksi scala dan Java menggunakan metode asScala dan asJava.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

lihat situs scala doc hubungan konversi

pengguna1553728
sumber
6

Shortcut untuk mengubah daftar java ke daftar scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Xing-Wei Lin
sumber