1

次の関数が必要です: 次のパラメータを取ります:

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

..指定された in パラメータqueryStringが含まれている場合、対応する値を に追加します。keyfilters

作業機能は次のとおりです。

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
}

これは恐ろしく見えますよね?

ステートメントは Scala で何かを返すのでif、私はこれらの行に沿って何かを期待していました:

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)
  }
}

しかし、これはコンパイルされません。エラーは次のとおりです。

型の不一致; found : 必要な単位: Map[String,String]

4

3 に答える 3

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 に答える
5

よりモナドを使用できます

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

それはあなたが望むことをします。

于 2012-11-14T22:00:11.687 に答える
4

あなたの関数の署名はMap[String, String]返されるべきだと述べていますが...ちょっと待って想像してみてください.queryStringにキーが含まれていない場合はどうなるでしょうか? まあ、何も返されないように見えますが、Unit は Scala では何もありません (少なくとも何もない種類の 1 つです)。

その問題を解決するには、代替手段を提供する必要があります。

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 に答える