2014-04-22 65 views
1

我想将java.util.List转换为Scala列表。在后674713中提出了很多可能性,所以我想知道哪一个是最好的。我正在使用Play 2.1.1。我的模型是:将java.util.List转换为Scala列表的最佳解决方案

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))) 
} 

但这个执行我的项目(“MatchError:空”上listWrites)时产生错误。因此,我想将我的java.util.List转换为Scala,以避免使用这个不起作用的编写器。任何解决方案

+0

的可能重复[如何将Java UTIL列表斯卡拉列表(http://stackoverflow.com/questions/16162090/how-to-convert-java-util-list-to-scala-list ) – Peter

回答

4

在默认情况我会下手的:

import scala.collection.JavaConverters._ 
data.asScala //var data: java.util.List[T] 

这将返回一个缓冲区,作为JavaList是可变的。要转换到一个列表,你将不得不又拨打了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._ 
+0

我没有asScala方法。我有asScalaSet,asScalaMap,... – Christophe

+0

适用于我:scala>新的java.util.LinkedList [String] .asScala res3:scala.collection.mutable.Buffer [String] = Buffer()。你使用的是什么版本的Scala。该示例基于2.10。 –

+0

我正在使用Play 2.1.1。所以我认为它也是Scala 2.1。 – Christophe