什么是scala方式来做到这一点

chi*_*one 2 scala playframework-2.0

试图解析request.queryString,它返回一个Map [String,Seq [String]]

var route = ""
var queryString = "?"
for((k,v) <- request.queryString) {
  if(k == "route"){ route = v.head }
  else {
    queryString += k +"="+ v.head +"&"
  }
}
queryString = queryString.substring(0, queryString.length() -1 );
Run Code Online (Sandbox Code Playgroud)

这很好,但非常必要.我确信有一种更实用的方法可以做到这一点.有帮助吗?

lee*_*777 7

帮助就在这里!过度评论.

val RouteKey = "route"

val route = request
    .getOrElse(RouteKey, Nil) // will return the route, or empty list
    .headOption               // either Some[head] or None
    .getOrElse("")            // if None, empty string

val queryString = (request - RouteKey)     // remove the route from the request
  .map { case (k, v) =>                    // map each key/value pair
    k + "=" + v.headOption.getOrElse("") } // into key=value strings
  .mkString("?", "&", "")                  // make that list into a single string
Run Code Online (Sandbox Code Playgroud)

您会注意到我使用相同的模式head从列表中安全地获取,以处理空列表.如果你发现自己做了很多,那么你可以添加该方法Seq[String].

implicit def pimpedStringSeq(seq: Seq[String]) = new {
  def headStr = seq.headOption.getOrElse("")
}

val RouteKey = "route"

val route = request.getOrElse(RouteKey, Nil).headStr

val queryString = (request - RouteKey).map { case (k, v) => k + "=" + v.headStr }
  .mkString("?", "&", "")
Run Code Online (Sandbox Code Playgroud)