2013-12-12 81 views
0

我的API當前採用名爲gamedate的可選參數。它以一個字符串的形式傳入,在這個時候我稍後使用一些實用程序代碼將它解析爲一個Date對象。代碼看起來像這樣:Scala:解析API參數

val gdate:Option[String] = params.get("gamedate") 
val res = gdate match { 
    case Some(s) => { 
    val date:Option[DateTime] = gdate map { MyDateTime.parseDate _ } 
    val dateOrDefault:DateTime = date.getOrElse((new DateTime).withTime(0, 0, 0, 0)) 
    NBAScoreboard.findByDate(dateOrDefault) 
    } 
    case None => NBAScoreboard.getToday 
} 

這工作得很好。現在我想解決的是我允許多個遊戲通過逗號分隔的列表傳入。本來你可以通過這樣的參數:

gamedate=20131211

現在我希望允許OR:

gamedate=20131211,20131212

需要修改上面的代碼,試圖拆分逗號分隔字符串將每個值解析爲Date並將接口更改爲findByDate以接受Seq [DateTime] vs DateTime。我試圖運行這樣的事情,但顯然它不是去了解它的方式:

val res = gdates match { 
     case Some(s) => { 
     val dates:Option[Seq[DateTime]] = gdates map { _.split(",").distinct.map(MyDateTime.parseDate _)} 
     val datesOrDefault:Seq[DateTime] = dates map { _.getOrElse((new DateTime).withTime(0, 0, 0, 0))} 
     NBAScoreboard.findByDates(datesOrDefault) 
     } 
     case None => NBAScoreboard.getToday 
    } 

什麼是我的第一套轉換的代碼來處理這個用例的最佳方式?在我提供的第二個代碼示例中,我可能相當接近,但我只是沒有達到正確的效果。

回答

3

你混淆了容器。您致電datesmapOption解包,以便將getOrElse應用於列表。

val res = gdates match { 
    case Some(s) => 
    val dates = gdates.map(_.split(",").distinct.map(MyDateTime.parseDate _)) 
    val datesOrDefault = dates.getOrElse(Array((new DateTime).withTime(0, 0, 0, 0))) 
    NBAScoreboard.findByDates(datesOrDefault) 

    case _ => 
    NBAScoreboard.getToday 
} 

這應該有效。

+0

但是,看起來你的代碼仍然在getOrElse()上斷了。 'value getOrElse不是Array [org.joda.time.DateTime]的成員' – randombits

+0

謝謝,那裏仍然有錯誤。 – tmbo