Как преобразовать java.util.List в список Scala

105

У меня есть этот метод Scala с ошибкой ниже. Невозможно преобразовать в список Scala.

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

несоответствие типов; найдено: java.util.List[com.aitrich.learnware.model.domain.entity.Question]требуется: scala.collection.immutable.List[com.aitrich.learnware.model.domain.entity.Question]

бойкод3
источник
3
Люди, которые рассматривают этот вопрос, могут найти другой интересный вопрос: stackoverflow.com/questions/8301947/…
Amndeep7,

Ответы:

70
import scala.collection.JavaConversions._

сделает за вас неявное преобразование; например:

var list = new java.util.ArrayList[Int](1,2,3)
list.foreach{println}
Нил
источник
11
scala.collection.JavaConversions._устарел в пользу, scala.collection.JavaConverters._поэтому этот ответ лучше
Декстер Легаспи
JavaConverts устарел в пользу: начиная с версии scala.jdk.CollectionConverters._2.13. Подробности можно найти здесь .
Стивен Левин,
123

Вы можете просто преобразовать список с помощью Scala JavaConverters:

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  questionDao.getAllQuestions().asScala
}
Финн
источник
2
Кажется, это работает .. def findAllStudentTest (): List [StudentTest] = {var list = studentTestDao.getAllStudentTests () var slist = list.asScala.toList slist}
boycod3
13
java.util.List .asScala как ни странно возвращается в качестве буфера.
phillro
2
Я тоже: `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 Если Scala Bufferявляется Java List, то ничего не будет хорошо! OP требовал преобразования из списка Java List в неизменный список Scala. Выражения, которые ожидают Scala List, не будут проверять тип с помощью Buffer.
Андрес Ф.
4
вы забыли добавить, .toList поэтому код такойquestionDao.getAllQuestions().asScala.toList
Raymond
30
def findAllStudentTest(): List[StudentTest] = { 
  studentTestDao.getAllStudentTests().asScala.toList
} 
бойкод3
источник
3
Почему varс? Кроме того, кажется, что последние две строки можно объединить в однуlist.asScala.toList
redent84
первый список var получит список java util, а второй slist преобразует список java util в список scala.
boycod3
4
Я имею в виду, почему, varа не valесли вы не
изменяете
Но в случае подопераций нам нужно использовать var вместо val.
boycod3 01
Оба var listи val slistбыли ненужными. Я думаю, что они усложнили этот ответ, поэтому я объединил их и сделал ответ более простым. @ jijeshvu07 Если вы не согласны, я был бы рад отменить правку и вместо этого отправить это изменение в качестве собственного ответа.
Кори Кляйн
9

Начиная Scala 2.13с пакета, scala.collection.JavaConvertersон помечается как устаревший в пользу 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

Импорт JavaConverters, ответ @fynn отсутствовалtoList

import scala.collection.JavaConverters._

def findAllQuestion():List[Question] = {
  //           java.util.List -> Buffer -> List
  questionDao.getAllQuestions().asScala.toList
}
Раймон Шенон
источник