1

我想要以下功能:采用以下参数:

  • def filters: Map[String, String]
  • def queryString: Map[String, Seq[String]](来自 request.queryString)
  • def key: String

..如果queryString包含key指定的参数,我想将相应的值添加到filters

一个工作函数是:

private def getUpdatedFiltersIfQueryStringContains(filters: Map[String, String], queryString: Map[String, Seq[String]], key: String): Map[String, String] = {
  var updatedFilters: Map[String, String] = filters

  if (queryString.contains(key)) {
    updatedFilters = updatedFilters ++ Map(key -> queryString.get(key).get.head)
  }

  updatedFilters
}

这看起来很可怕,对吧?

由于if语句在 Scala 中返回内容,因此我期待更多类似的内容:

private def getUpdatedFiltersIfQueryStringContains(filters: Map[String, String], queryString: Map[String, Seq[String]], key: String): Map[String, String] = {
  if (queryString.contains(key)) {
    filters ++ Map(key -> queryString.get(key).get.head)
  }
}

但这不会编译,错误是:

类型不匹配; 找到:所需单位:地图[字符串,字符串]

4

3 回答 3

5

你可以使用更一元的

queryString.get(key) map { v => filters ++ Map(key -> v.head) } getOrElse filters

哪个做你想要的。

于 2012-11-14T22:00:11.687 回答
5

这是一个不使用的更惯用的实现if

def getUpdatedFiltersIfQueryStringContains(filters: Map[String, String], queryString: Map[String, Seq[String]], key: String): Map[String, String] =
  filters ++ queryString.get(key).map(key -> _.head)
于 2012-11-14T22:53:49.660 回答
4

您的函数签名说明Map[String, String]应该返回,但是......稍等片刻,想象一下,如果 queryString 不包含键怎么办?好吧,看起来什么都不会返回,并且 Unit 在 Scala 中什么都不是(至少是无类型之一)。

要解决该问题,您需要提供替代方案:

private def getUpdatedFiltersIfQueryStringContains(filters: Map[String, String], queryString: Map[String, Seq[String]], key: String): Map[String, String] = {
    if (queryString.contains(key)) {
      filters ++ Map(key -> queryString.get(key).get.head)
    } else filters
  }

顺便说一句,函数名真的吓到我了

于 2012-11-14T21:59:42.023 回答