Como converter um java.util.List em uma lista Scala


105

Eu tenho esse método Scala com o erro abaixo. Não é possível converter em uma lista Scala.

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

tipo incompatível; encontrado: java.util.List[com.aitrich.learnware.model.domain.entity.Question]obrigatório: scala.collection.immutable.List[com.aitrich.learnware.model.domain.entity.Question]


3
Pessoas olhando para esta questão podem achar esta outra questão de interesse: stackoverflow.com/questions/8301947/…
Amndeep7

Respostas:


70
import scala.collection.JavaConversions._

fará a conversão implícita para você; por exemplo:

var list = new java.util.ArrayList[Int](1,2,3)
list.foreach{println}

10
scala.collection.JavaConversions._foi descontinuado em favor de scala.collection.JavaConverters._então esta resposta é melhor
Dexter Legaspi

JavaConverts foi preterido em favor de: a scala.jdk.CollectionConverters._partir de 2.13. Os detalhes podem ser encontrados aqui .
Steven Levine

122

Você pode simplesmente converter a lista usando o do Scala JavaConverters:

import scala.collection.JavaConverters._

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

2
Isso parece funcionar .. def findAllStudentTest (): List [StudentTest] = {var list = studentTestDao.getAllStudentTests () var slist = list.asScala.toList slist}
boycod3

13
um java.util.List .asScala volta estranhamente como um buffer para mim.
phillro

2
Eu também: `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) `
crítico de

2
@mauhiz Se um Scala Bufferé um Java List, então nada está bem! O OP queria uma conversão da Lista Java em uma Lista Scala imutável. Expressões que esperam uma Scala Listnão typecheck com um Buffer.
Andres F.

4
você esqueceu de adicionar, .toList então o código équestionDao.getAllQuestions().asScala.toList
Raymond Chenon

30
def findAllStudentTest(): List[StudentTest] = { 
  studentTestDao.getAllStudentTests().asScala.toList
} 

3
Por que o vars? Além disso, parece que as duas últimas linhas poderiam ser combinadas em uma única linhalist.asScala.toList
redent84 de

a primeira lista var obterá a lista de utilitários java e o segundo slist converterá a lista de utilitários java em lista scala.
boycod3

4
Quero dizer, por que em varvez de valse você não está modificando a variável
redent84

Mas no caso de suboperações, precisamos usar var em vez de val.
boycod

Ambos var liste val slisteram desnecessários. Acho que eles complicaram essa resposta, então os consolidei e tornei a resposta mais simples. @ jijeshvu07 Se você discordar, terei o prazer de desfazer a edição e enviar a alteração como sua própria resposta.
Cory Klein

9

A partir de Scala 2.13, o pacote scala.collection.JavaConvertersestá marcado como obsoleto em 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)

6

Importar JavaConverters, a resposta de @fynn estava faltandotoList

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  //           java.util.List -> Buffer -> List
  questionDao.getAllQuestions().asScala.toList
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.