2013-12-12 44 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