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.