Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-09-13) 解析一句信息量很大的代码

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

在scalatra的RichRequest类中,发现了一句信息量很大的代码,值得分析。代码如下:

import scala.collection.{Map => CMap}

case class RichRequest(r: HttpServletRequest) extends AttributesMap {

  def multiCookies: CMap[String, Seq[String]] =
    Option(r.getCookies).getOrElse(Array()).toSeq.
      groupBy { _.getName }.
      transform { case(k, v) => v map { _.getValue }}.
      withDefaultValue(Seq.empty)
}

其中r.getCookies()将返回一个Cookie[].


multiCookies的作用,是把request的cookies转换成一个Map[String,Seq[String]],其中key为cookie的name,值为cookie的value的序列。因为可能有多个同名的cookie,所以是个序列。另外,如果请求的cookie不存在,返回一个空序列。

Option(r.getCookies) // -> 把cookies变成一个Option,方便后面的操作
  .getOrElse(Array()) // -> 得到cokkies,如果为空,得到一个空数组
  .toSeq // -> 把数组变成序列,方便后面操作
  .groupBy { _.getName } // 按name,将序列中的元素分组,得到一个Map[String, Seq[Cookie]]
  .transform { case(k,v) => v map { _.getValue } // -> 得到一个新Map,key为原key,值变成原值的value
  .withDefaultValue(Seq.empty) // -> 设定对于不存在的key,返回一个Seq.empty
comments powered by Disqus