scala的方法是什么

scala的方法是什么,scala,playframework-2.0,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 = querySt

正在尝试解析出一个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 );
var route=“”
var queryString=“?”

对于((k,v)来说没有那么好,但是你可以使用折叠

import scalaz._
import Scalaz._

request.queryString.foldLeft(("?", "")) { case ((route, queryString), (k, v)) =>
  if(k == "route")
    (v.head, queryString)
  else
    (route, queryString + k + "=" + v.head + "&")
} :-> (_.init)
这个可爱的微笑操作符(
:->
)用于转换我们在折叠末尾得到的2元组的第二个元素。它可以如下所示:

t :-> f == (t._1, f(t._2))
你可以看到来源

控制台中的示例:

scala> val requestQueryString = Map("route" -> Seq("a"), "foo" -> Seq("b"), "bar" -> Seq("c"))
requestQueryString: scala.collection.immutable.Map[java.lang.String,Seq[java.lang.String]] = Map(route -> List(a), foo -
> List(b), bar -> List(c))

scala> var route = ""
var queryString = "?"
for((k,v) <- requestQueryString) {
  if(k == "route"){ route = v.head }
  else {
    queryString += k +"="+ v.head +"&"
  }
}
queryString = queryString.substring(0, queryString.length() -1 );
route: java.lang.String = a
queryString: java.lang.String = ?foo=b&bar=c
queryString: java.lang.String = ?foo=b&bar=c

scala> requestQueryString.foldLeft(("?", "")) { case ((queryString, route), (k, v)) =>
  if(k == "route")
    (queryString, v.head)
  else
    (queryString + k + "=" + v.head + "&", route)
}
res8: (java.lang.String, java.lang.String) = (?foo=b&bar=c&,a)

scala> ((_: String).init) <-: res8
res9: (String, java.lang.String) = (?foo=b&bar=c,a)

scala> requestQueryString.foldLeft(("?", "")) { case ((route, queryString), (k, v)) =>
  if(k == "route")
    (v.head, queryString)
  else
    (route, queryString + k + "=" + v.head + "&")
} :-> (_.init)
res10: (java.lang.String, String) = (a,foo=b&bar=c)
scala>val requestQueryString=Map(“路由”->Seq(“a”),“foo”->Seq(“b”),“条”->Seq(“c”))
requestQueryString:scala.collection.immutable.Map[java.lang.String,Seq[java.lang.String]]=Map(路由->列表(a),foo-
>列表(b),栏->列表(c))
scala>var route=“”
var queryString=“?”
for((k,v)requestQueryString.foldLeft((“?”,“){case((queryString,route),(k,v))=>
如果(k==“路线”)
(查询字符串,v.head)
其他的
(查询字符串+k+“=”+v.head+“&”,路线)
}
res8:(java.lang.String,java.lang.String)=(?foo=b&bar=c&,a)
scala>((:String).init)requestQueryString.foldLeft((“?”,“){case((路由,查询字符串),(k,v))=>
如果(k==“路线”)
(v.头部,查询字符串)
其他的
(路线,查询字符串+k+“=”+v.head+“&”)
}:->(u.init)
res10:(java.lang.String,String)=(a,foo=b&bar=c)

这里有帮助!评论过多

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
您会注意到,我使用了相同的模式来安全地从列表中获取
,以处理空列表。如果您发现自己经常这样做,那么您可以将该方法添加到
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("?", "&", "")

scalaz中
:->
的目的是什么?无论目的是什么,接线员都会让我微笑:->@om-nom-nom,我扩展了我的答案。