scala - 如何在 Scala 映射中优雅地处理 "Key not found"?

标签 scala dictionary scala-collections

总而言之,如果在 map 中找到某个值,我需要一种功能性的方法来做一件事,如果没有找到该值,我需要做另一件事请注意,我对返回的值不感兴趣,而是对完成的操作感兴趣。

请继续阅读以了解详细信息。

我有一个服务名称(友好)到 URL 路径的一部分(不容易记住)的映射。 这里是初始化。

val serviceMap = Map("read" -> "cryptic-read-path",
  "save" -> "cryptic-save-path", "county" -> "cryptic-zip-code-to-county-service.");

我所知道的所有替代方案都会导致 if 语句带有加载的 then 部分,但只是一个简单的 404 else 部分。 以下是我的一些思考

if (serviceMap.contains(service)) {
    //Do stuff
} else {
    //Issue a 404
}

相当于谓词反转

if (!serviceMap.contains(key)) //issue a 404
//Do stuff

上述两种方法都需要我先检查后获取。

另一个(被Option documentation劝阻)

  serviceMap.get(service) match {
  case _ : Option[String]=> //Do stuff
  case _  => //issue 404
}

还有第三个

  serviceMap.get(service).forEach {//Dostuff and return, since it's just one element }
  //issue 404 if you are here.

Option documentation ,我鼓励将 Option 视为一个集合,因此最后一个替代方案似乎更好,但使用 forEach 在循环后更改执行流程似乎很奇怪。

这是我的经验不足,但所有这些对我来说都显得太冗长和不合适。你们能给我更好的选择或对这些方法发表评论吗? 感谢期待!

最佳答案

几个更清晰的选项:

  1. matchunapply (这避免了 _ : Option[CantTellWhatThisIsAtRuntime] 的类型删除问题):

    serviceMap.get(service) match {
      case Some(path) => // Do stuff and return
      case _ => // 404
    }
    
  2. 使用 fold 提取值(假设您可以正确输入 404):

    serviceMap.get(service).fold(/* 404 */) { path =>
      // Do stuff and return
    }
    
  3. 使用 map + getOrElse 将路径转换为响应或返回/抛出 404 ( hat tip to Mikesname ):

    serviceMap.get(service).map { path =>
      // Do stuff and return
    } getOrElse {
      // 404
    }
    
  4. 使用 MapgetOrElse 方法(假设您抛出 404):

    val path = serviceMap.getOrElse(service, throw Error404)
    // Do stuff and return
    

关于scala - 如何在 Scala 映射中优雅地处理 "Key not found"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32360792/

相关文章:

scala - 为什么 Actor.receive 是一个偏函数?

scala - 为什么 vector[Option[Int]] 上的 flatMap 其映射器函数结果不是 Vector[Option[Int]] 有效?

java - 如何使用 Spring ClientResponse 使用 Map?

python:dict上json.dumps的行为

java - 如何在 Java 代码中等待 scala Future

scala - 对 Union 类型使用 Any 是个好主意吗?

swift - 字典不符合 ExtensibleCollectionType

scala Iterator#foreach 性能问题

Scala: "map"vs "foreach"- 在实践中是否有任何理由使用 "foreach"?

arrays - 是否可以使用 assertResult 在 ScalaTest 中检查数组是否相等