如何使用不可变集合和if语句编写适当的Scala?

Bla*_*ird 1 collections scala scala-collections

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

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

..如果queryString包含key指定的in参数,我想添加相应的值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
}
Run Code Online (Sandbox Code Playgroud)

这看起来很可怕,对吧?

由于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)
  }
}
Run Code Online (Sandbox Code Playgroud)

但这不编译,错误是:

类型不匹配; 找到:需要的单位:Map [String,String]

Sam*_*ieu 5

你可以使用更多的monadic

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

哪能做到你想要的.


Ben*_*mes 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)
Run Code Online (Sandbox Code Playgroud)