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

13 浏览
0 Comments

将java.util.List转换为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]))
}

这段代码不能工作,因为我需要为通用的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)))
}

但是当执行我的项目时会生成错误("MatchError: null" on listWrites)。因此,我想将我的java.util.List转换为Scala列表,以避免使用这个不起作用的写入器。有什么解决方法?

0
0 Comments

最佳解决方案将java.util.List转换为Scala列表的原因是需要在Java和Scala之间进行数据类型转换。在Scala中,使用JavaConverters中的asScala方法可以将Java的List转换为Scala的Buffer,然后再使用toList方法将其转换为Scala的List。这种方法是明确的,简短易读,并且在不同版本中都可以正常工作。

另一种解决方案是通过添加隐式转换来实现。在这种方法中,创建一个名为Example的对象,其中定义了一个名为Data的隐式类,该类接受java.util.List作为参数,并使用asScala.toList方法将其转换为Scala的List。通过导入这个隐式转换,就可以通过调用data.toScalaList来实现转换。

在实际应用中,可以根据需要选择合适的解决方案。根据Scala的版本不同,可以使用不同的解决方案。如果使用的是Scala 2.8及以上版本,则可以使用JavaConverters中的asScala方法进行转换。如果使用的是Play框架,则可能无法直接使用build.sbt文件来指定Scala的版本,而是需要查看相关文档或配置文件来确定Scala的版本。

根据用户的反馈,第一个解决方案可以正常工作,并且用户还提到了在构造函数参数中将java.util.List转换为Scala的不可变列表的问题。用户表示,他们已经在模型中使用了Scala的列表,并在需要在项目中进行转换时使用asScala.toList方法。感谢用户的反馈和支持。

总结起来,将java.util.List转换为Scala列表可以通过使用JavaConverters中的asScala方法和toList方法来实现,也可以通过添加隐式转换来实现。根据实际需求和使用的Scala版本,可以选择合适的解决方案。

0