Cómo convertir una java.util.List a una lista de Scala

105

Tengo este método Scala con el siguiente error. No se puede convertir en una lista Scala.

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

desajuste de tipos; encontrado: java.util.List[com.aitrich.learnware.model.domain.entity.Question]requerido: scala.collection.immutable.List[com.aitrich.learnware.model.domain.entity.Question]

boycod3
fuente
3
Las personas que miran esta pregunta pueden encontrar esta otra pregunta de interés: stackoverflow.com/questions/8301947/…
Amndeep7

Respuestas:

70
import scala.collection.JavaConversions._

hará una conversión implícita por usted; p.ej:

var list = new java.util.ArrayList[Int](1,2,3)
list.foreach{println}
Neil
fuente
10
scala.collection.JavaConversions._está en desuso a favor de, scala.collection.JavaConverters._por lo que esta respuesta es mejor
Dexter Legaspi
JavaConverts ha quedado obsoleto en favor de: a scala.jdk.CollectionConverters._partir de 2.13. Los detalles se pueden encontrar aquí .
Steven Levine
122

Simplemente puede convertir la Lista usando Scala JavaConverters:

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  questionDao.getAllQuestions().asScala
}
Fynn
fuente
2
Esto parece funcionar ... def findAllStudentTest (): List [StudentTest] = {var list = studentTestDao.getAllStudentTests () var slist = list.asScala.toList slist}
boycod3
13
un java.util.List .asScala vuelve como un búfer para mí extrañamente.
phillro
2
Yo también: `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 Si ​​Scala Bufferes Java List, ¡ nada está bien! El OP quería una conversión de Java List a una Scala List inmutable. Las expresiones que esperan un Scala Listno se verifican con un Buffer.
Andrés F.
4
olvidó agregar, .toList por lo que el código esquestionDao.getAllQuestions().asScala.toList
Raymond Chenon
30
def findAllStudentTest(): List[StudentTest] = { 
  studentTestDao.getAllStudentTests().asScala.toList
} 
boycod3
fuente
3
¿Por qué la vars? Además, parece que las dos últimas líneas podrían combinarse en una sola línealist.asScala.toList
redent84
la primera lista de var obtendrá la lista de utilidades de Java y la segunda lista convertirá la lista de utilidades de Java a la lista de Scala.
boycod3
4
Quiero decir, ¿por qué en varlugar de valsi no está modificando la variable
Redent84
Pero en el caso de las suboperaciones, necesitamos usar var en lugar de val.
boycod3
Tanto el var listcomo val slisteran innecesarios. Creo que hicieron esta respuesta más complicada, así que los consolidé y simplifiqué la respuesta. @ jijeshvu07 Si no está de acuerdo, me complacerá deshacer la edición y enviar este cambio como su propia respuesta.
Cory Klein
9

A partir Scala 2.13, el paquete scala.collection.JavaConvertersse marca como obsoleto a favor de 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
fuente
6

Importar JavaConverters, faltaba la respuesta de @fynntoList

import scala.collection.JavaConverters._

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