【问题标题】:How to convert a java.util.List to a Scala list如何将 java.util.List 转换为 Scala 列表
【发布时间】:2013-04-16 05:44:27
【问题描述】:

我有以下错误的 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]

【问题讨论】:

标签: list scala scala-java-interop


【解决方案1】:

您可以使用 Scala 的 JavaConverters 简单地转换列表:

import scala.collection.JavaConverters._

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

【讨论】:

  • 这似乎工作.. def findAllStudentTest(): List[StudentTest] = { var list = studentTestDao.getAllStudentTests() var slist = list.asScala.toList slist }
  • 一个 java.util.List .asScala 奇怪地作为我的缓冲区回来了。
  • 我也是:`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)`
  • @mauhiz 如果 Scala Buffer 是 Java List,那么 nothing 没问题! OP 想要从 Java List 转换为不可变的 Scala List。期望 Scala List 的表达式不会使用 Buffer 进行类型检查。
  • 你忘了加.toList所以代码是questionDao.getAllQuestions().asScala.toList
【解决方案2】:
def findAllStudentTest(): List[StudentTest] = { 
  studentTestDao.getAllStudentTests().asScala.toList
} 

【讨论】:

  • 为什么是vars?另外,最后两行似乎可以合并为一行list.asScala.toList
  • 第一个 var 列表将获取 java util 列表,第二个 slist 将 java util 列表转换为 scala 列表。
  • 我的意思是,如果你不修改变量,为什么要用var 而不是val
  • 但是在case子操作中,我们需要使用var而不是val。
  • var listval slist 都是不必要的。我认为他们使这个答案变得更复杂,所以我将它们合并并使答案更简单。 @jijeshvu07 如果您不同意,我很乐意撤消编辑并提交此更改作为自己的答案。
【解决方案3】:
import scala.collection.JavaConversions._

会为你做隐式转换;例如:

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

【讨论】:

  • scala.collection.JavaConversions._scala.collection.JavaConverters._ 弃用,所以this answer 更好
  • JavaConverts 已被弃用,取而代之的是:scala.jdk.CollectionConverters._ 自 2.13 起。详情可见here
【解决方案4】:

导入JavaConverters ,@fynn 的响应不见了toList

import scala.collection.JavaConverters._

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

【讨论】:

    【解决方案5】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2011-06-05
      相关资源
      最近更新 更多