Jak przekonwertować java.util.List na listę Scala

105

Mam tę metodę Scala z poniższym błędem. Nie można przekonwertować na listę Scala.

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

niezgodność typów; znaleziono: java.util.List[com.aitrich.learnware.model.domain.entity.Question]wymagane: scala.collection.immutable.List[com.aitrich.learnware.model.domain.entity.Question]

boycod3
źródło
3
Osoby, które patrzą na to pytanie, mogą zainteresować inne pytanie: stackoverflow.com/questions/8301947/…
Amndeep7

Odpowiedzi:

70
import scala.collection.JavaConversions._

dokona niejawnej konwersji za Ciebie; na przykład:

var list = new java.util.ArrayList[Int](1,2,3)
list.foreach{println}
Neil
źródło
10
scala.collection.JavaConversions._jest przestarzały na korzyść, scala.collection.JavaConverters._więc ta odpowiedź jest lepsza
Dexter Legaspi
JavaConverts została wycofana na korzyść: scala.jdk.CollectionConverters._od 2.13. Szczegóły można znaleźć tutaj .
Steven Levine
122

Możesz po prostu przekonwertować listę za pomocą Scali JavaConverters:

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  questionDao.getAllQuestions().asScala
}
Fynn
źródło
2
Wygląda na to, że działa .. def findAllStudentTest (): List [StudentTest] = {var list = studentTest replace.getAllStudentTests () var slist = list.asScala.toList slist}
boycod3
13
java.util.List .asScala wraca dla mnie dziwnie jako bufor.
phillro
2
Ja też: `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 ] = Bufor (cześć, de) `
Critium
2
@mauhiz Jeśli Scala Bufferto Java List, nic nie jest w porządku! OP chciał konwersji z listy Java do niezmiennej listy Scala. Wyrażenia, które oczekują Scala List, nie sprawdzają typu z rozszerzeniem Buffer.
Andres F.,
4
zapomniałeś dodać, .toList więc kod brzmiquestionDao.getAllQuestions().asScala.toList
Raymond Chenon
30
def findAllStudentTest(): List[StudentTest] = { 
  studentTestDao.getAllStudentTests().asScala.toList
} 
boycod3
źródło
3
Dlaczego vars? Wydaje się również, że ostatnie dwie linie można połączyć w jedną linięlist.asScala.toList
redent84
pierwsza lista var otrzyma listę narzędzi java, a druga lista przekonwertuje listę narzędzi java na listę scala.
boycod3
4
Mam na myśli, dlaczego varzamiast valmodyfikować zmienną
redent84
Ale w przypadku operacji podrzędnych musimy użyć var ​​zamiast val.
bojkod3
Zarówno opcje, jak var listi val slistbyły niepotrzebne. Myślę, że skomplikowali tę odpowiedź, więc skonsolidowałem je i uprościłem odpowiedź. @ jijeshvu07 Jeśli się nie zgadzasz, z przyjemnością cofnę zmianę i prześlę tę zmianę jako własną odpowiedź.
Cory Klein,
9

Począwszy Scala 2.13od pakietu scala.collection.JavaConvertersjest oznaczany jako przestarzały na korzyść 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
źródło
6

Importuj JavaConverters, brakowało odpowiedzi @fynntoList

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  //           java.util.List -> Buffer -> List
  questionDao.getAllQuestions().asScala.toList
}
Raymond Chenon
źródło