将 java.util.List 转换为 Scala 列表的最佳解决方案

Chr*_*phe 1 scala

我正在尝试将 java.util.List 转换为 Scala 列表。674713 帖子中提出了多种可能性,所以我想知道哪一种是最好的。我使用的是 Play 2.1.1。我的模型是:

case class Page[T](
    var data: java.util.List[T],
    var previous: String,
    var next: String,
    var totalPageCount: Int)(implicit val tWrites: Writes[T])

object Page {

    implicit def pageWrites[T: Writes]: Writes[Page[T]] = (
        (__ \ 'data).write[java.util.List[T]] and
        (__ \ 'previous).write[String] and
        (__ \ 'next).write[String] and
        (__ \ 'totalPageCount).write[Int])(unlift(Page.unapply[T]))
}
Run Code Online (Sandbox Code Playgroud)

此代码不起作用,因为我需要为通用 java.util.List[T] 类型添加编写器。

我已将其添加到我的对象 Page 中:

implicit def listWrites[T](implicit fmt: Writes[T]): Writes[List[T]] = new Writes[List[T]] {
    def writes(ts: List[T]) = JsArray(ts.map(t => Json.toJson(t)(fmt)))
}
Run Code Online (Sandbox Code Playgroud)

但这在执行我的项目时会产生错误(listWrites 上的“MatchError:null”)。因此,我想将 java.util.List 转换为 Scala 以避免使用这个不起作用的编写器。有什么解决办法吗?

And*_*ann 5

默认情况下我会从以下开始:

import scala.collection.JavaConverters._
data.asScala //var data: java.util.List[T]
Run Code Online (Sandbox Code Playgroud)

这将返回一个缓冲区,因为 JavaList 是可变的。要转换为列表,您还必须调用 toList 方法

data.asScala.toList //List[T]
Run Code Online (Sandbox Code Playgroud)

这将使转换变得明确,可读性短,并且必然可以在不同版本中工作,因为它是标准库的一部分。

这是通过添加隐式转换的解决方案。如果导入转换,您现在应该能够调用data.toScalaList 。

object Example {
  implicit class Data[T](data: java.util.List[T]) {
    import scala.collection.JavaConverters._
    def toScalaList: List[T] = data.asScala.toList
  }
}

//just import it with
import Example._
Run Code Online (Sandbox Code Playgroud)