2014-04-22 106 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