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?



@ 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


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.


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()

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))
   }
}

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


6

Shortcut untuk mengubah daftar java ke daftar scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

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.