So konvertieren Sie eine java.util.List in eine Scala-Liste

105

Ich habe diese Scala-Methode mit dem folgenden Fehler. Kann nicht in eine Scala-Liste konvertiert werden.

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

Typfehlanpassung; gefunden: java.util.List[com.aitrich.learnware.model.domain.entity.Question]erforderlich: scala.collection.immutable.List[com.aitrich.learnware.model.domain.entity.Question]

boycod3
quelle
3
Leute, die sich diese Frage ansehen,
Amndeep7

Antworten:

70
import scala.collection.JavaConversions._

wird implizite Konvertierung für Sie durchführen; z.B:

var list = new java.util.ArrayList[Int](1,2,3)
list.foreach{println}
Neil
quelle
10
scala.collection.JavaConversions._wird zugunsten von abgelehnt, scala.collection.JavaConverters._daher ist diese Antwort besser
Dexter Legaspi
JavaConverts wurde zugunsten von: scala.jdk.CollectionConverters._ab 2.13 veraltet . Details finden Sie hier .
Steven Levine
122

Sie können die Liste einfach mit Scala konvertieren JavaConverters:

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  questionDao.getAllQuestions().asScala
}
Fynn
quelle
2
Dies scheint zu funktionieren .. def findAllStudentTest (): List [StudentTest] = {var list = studentTestDao.getAllStudentTests () var slist = list.asScala.toList slist}
boycod3
12
Eine java.util.List .asScala kommt seltsamerweise als Puffer für mich zurück.
Phillro
2
Ich auch: `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) `
Kriterium
2
@mauhiz Wenn eine Scala Bufferein Java ist List, dann ist nichts in Ordnung! Das OP wollte eine Konvertierung von Java List in eine unveränderliche Scala List. Ausdrücke, die eine Scala erwarten, Listwerden nicht mit a typecheck Buffer.
Andres F.
4
Sie haben vergessen hinzuzufügen, .toList so lautet der CodequestionDao.getAllQuestions().asScala.toList
Raymond Chenon
29
def findAllStudentTest(): List[StudentTest] = { 
  studentTestDao.getAllStudentTests().asScala.toList
} 
boycod3
quelle
3
Warum das vars? Es scheint auch, dass die letzten beiden Zeilen zu einer einzigen Zeile kombiniert werden könntenlist.asScala.toList
redent84
Die erste Var-Liste erhält die Java-Util-Liste und die zweite Slist konvertiert die Java-Util-Liste in die Scala-Liste.
Boycod3
4
Ich meine, warum varanstatt valwenn Sie die Variable nicht
ändern
Aber in den Unteroperationen müssen wir var anstelle von val verwenden.
Boycod3
Sowohl das var listals auch val slistwaren unnötig. Ich denke, sie haben diese Antwort komplizierter gemacht, also habe ich sie konsolidiert und die Antwort einfacher gemacht. @ jijeshvu07 Wenn Sie nicht einverstanden sind, würde ich gerne die Bearbeitung rückgängig machen und diese Änderung stattdessen als eigene Antwort einreichen.
Cory Klein
9

Ab Scala 2.13dem Start wird das Paket scala.collection.JavaConvertersals veraltet markiert, und zwar zugunsten von 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
quelle
6

Importieren JavaConverters, die Antwort von @fynn fehltetoList

import scala.collection.JavaConverters._

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