如何将 java.util.List 转换为 Scala 列表

115

我有一个 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
这个问题的读者可能会对另一个问题感兴趣:https://dev59.com/92sy5IYBdhLWcg3w0RM5。 - Amndeep7
5个回答

142

您可以使用Scala的JavaConverters轻松地将List转换:

import scala.collection.JavaConverters._

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

2
这似乎是有效的.. def findAllStudentTest(): List[StudentTest] = { var list = studentTestDao.getAllStudentTests() var slist = list.asScala.toList slist } - boycod3
14
对我而言,a java.util.List .asScala 返回的是一个缓冲区对象,这有些奇怪。 - phillro
3
如果Scala的Buffer是Java的List,那么什么都不好!原帖中想要将Java的List转换为不可变的Scala List。期望一个Scala List的表达式不会与Buffer类型检查通过。 - Andres F.
6
你忘记了添加 .toList,所以代码应该是 questionDao.getAllQuestions().asScala.toList - Raymond Chenon
2
只需编写 asScala.toList,它就会转换为 Scala 列表。 - kosiara - Bartosz Kosarzycki
显示剩余2条评论

76
import scala.collection.JavaConversions._

它会为您进行隐式转换,例如:

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

12
scala.collection.JavaConversions._已被弃用,建议使用scala.collection.JavaConverters._代替。因此,这个答案更好。 - Dexter Legaspi
4
JavaConverts已被弃用,推荐使用scala.jdk.CollectionConverters._替代,自Scala 2.13版本起生效。详细信息可在此处找到。 - Steven Levine

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

3
为什么要使用var?此外,最后两行似乎可以合并为一行 list.asScala.toList - redent84
第一个变量列表将获得Java Util List,第二个SList将把Java Util List转换为Scala List。 - boycod3
4
如果变量没有被修改,为什么要用var而不是val - redent84
但在子操作的情况下,我们需要使用 var 而不是 val。 - boycod3
var listval slist都是不必要的。我认为它们使得答案更加复杂,所以我将它们合并了,让答案变得更简单。@jijeshvu07 如果您有不同意见,我很乐意撤销编辑并将此更改作为自己的答案提交。 - Cory Klein
.asScala 在 Scala 2.12 中似乎不再被识别了。只需使用 .toList.toSeq 即可。 - akauppi

21

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)

8

导入JavaConverters,@fynn的响应缺少toList

import scala.collection.JavaConverters._

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接