Bagaimana mengonversi daftar java.util.List ke daftar Scala

105

Saya memiliki metode Scala ini dengan kesalahan di bawah ini. Tidak dapat diubah menjadi daftar Scala.

 def findAllQuestion():List[Question]={
   questionDao.getAllQuestions()
 } 

jenis ketidakcocokan; ditemukan: java.util.List[com.aitrich.learnware.model.domain.entity.Question]wajib: scala.collection.immutable.List[com.aitrich.learnware.model.domain.entity.Question]

boycod3
sumber
3
Orang-orang yang melihat pertanyaan ini mungkin menemukan pertanyaan menarik lainnya ini: stackoverflow.com/questions/8301947/…
Amndeep7

Jawaban:

70
import scala.collection.JavaConversions._

akan melakukan konversi implisit untuk Anda; misalnya:

var list = new java.util.ArrayList[Int](1,2,3)
list.foreach{println}
Neil
sumber
10
scala.collection.JavaConversions._tidak digunakan lagi scala.collection.JavaConverters._sehingga jawaban ini lebih baik
Dexter Legaspi
JavaConverts sudah tidak digunakan lagi karena mendukung: scala.jdk.CollectionConverters._mulai 2.13. Detailnya dapat ditemukan di sini .
Steven Levine
122

Anda cukup mengonversi Daftar menggunakan Scala's JavaConverters:

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  questionDao.getAllQuestions().asScala
}
Fynn
sumber
2
Sepertinya ini bekerja .. def findAllStudentTest (): List [StudentTest] = {var list = studentTestDao.getAllStudentTests () var slist = list.asScala.toList slist}
boycod3
13
sebuah java.util.List .asScala muncul kembali sebagai buffer bagi saya secara aneh.
phillro
2
Saya juga: `scala> import scala.collection.JavaConverters._` import scala.collection.JavaConverters._ scala> val l = new java.util.ArrayList [java.lang.String] l: java.util.ArrayList [String ] = [] scala> l.add ("hi") res70: Boolean = true scala> l.add ("de") res71: Boolean = true scala> l.asScala res72: scala.collection.mutable.Buffer [String ] = Buffer (hi, de) `
critium
2
@mauhiz Jika Scala Bufferadalah Java List, maka tidak ada masalah! OP menginginkan konversi dari Daftar Java ke Daftar Scala yang tidak dapat diubah. Ekspresi yang mengharapkan Scala Listtidak akan dicek dengan Buffer.
Andres F.
4
Anda lupa menambahkan .toList sehingga kodenya adalahquestionDao.getAllQuestions().asScala.toList
Raymond Chenon
30
def findAllStudentTest(): List[StudentTest] = { 
  studentTestDao.getAllStudentTests().asScala.toList
} 
boycod3
sumber
3
Mengapa vars? Juga, tampaknya dua baris terakhir dapat digabungkan menjadi satu barislist.asScala.toList
redent84
var list pertama akan mendapatkan daftar util java dan daftar kedua akan mengubah daftar util java ke daftar scala.
boycod3
4
Maksud saya, mengapa varalih - alih valjika Anda tidak memodifikasi variabel
redent84
Tetapi dalam kasus sub operasi, kita perlu menggunakan var daripada val.
boycod3
Baik var listdan val slisttidak perlu. Saya pikir mereka membuat jawaban ini lebih rumit, jadi saya mengkonsolidasikan mereka dan membuat jawabannya lebih sederhana. @ jijeshvu07 Jika Anda tidak setuju, saya akan dengan senang hati membatalkan pengeditan dan mengirimkan perubahan ini sebagai jawabannya.
Cory Klein
9

Dimulai Scala 2.13, paket scala.collection.JavaConvertersditandai sebagai tidak berlaku lagi untuk scala.jdk.CollectionConverters:

import scala.jdk.CollectionConverters._

// val javaList: java.util.List[Int] = java.util.Arrays.asList(1, 2, 3)
javaList.asScala.toList
// List[Int] = List(1, 2, 3)
Xavier Guihot
sumber
6

Impor JavaConverters, tanggapan @fynn hilangtoList

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  //           java.util.List -> Buffer -> List
  questionDao.getAllQuestions().asScala.toList
}
Raymond Chenon
sumber