总而言之,如果在 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
在循环后更改执行流程似乎很奇怪。
这是我的经验不足,但所有这些对我来说都显得太冗长和不合适。你们能给我更好的选择或对这些方法发表评论吗? 感谢期待!
最佳答案
几个更清晰的选项:
match
与unapply
(这避免了_ : Option[CantTellWhatThisIsAtRuntime]
的类型删除问题):serviceMap.get(service) match { case Some(path) => // Do stuff and return case _ => // 404 }
使用
fold
提取值(假设您可以正确输入 404):serviceMap.get(service).fold(/* 404 */) { path => // Do stuff and return }
使用
map
+getOrElse
将路径转换为响应或返回/抛出 404 ( hat tip to Mikesname ):serviceMap.get(service).map { path => // Do stuff and return } getOrElse { // 404 }
使用
Map
的getOrElse
方法(假设您抛出 404):val path = serviceMap.getOrElse(service, throw Error404) // Do stuff and return
关于scala - 如何在 Scala 映射中优雅地处理 "Key not found"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32360792/