我正在尝试将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]))
}
此代码不起作用,因为我需要为通用java.util.List [T]类型添加编写器。
我已将此添加到我的对象页面:
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)))
}
但是这会在执行我的项目时产生错误(listWrites上的“MatchError:null”)。因此,我想将我的java.util.List转换为Scala,以避免使用不起作用的此编写器。任何解决方案?
答案 0 :(得分:4)
默认情况下,我开始使用:
import scala.collection.JavaConverters._
data.asScala //var data: java.util.List[T]
这将返回一个缓冲区,因为JavaList是可变的。要转换为List,您还必须调用toList方法
data.asScala.toList //List[T]
这会使转换变得明确,可读性很小,并且必须在不同版本中运行,因为它是标准库的一部分。
这是一个通过添加隐式转换的解决方案。如果导入转换,您现在应该能够调用 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._