如何从Option [Map [String,Seq [String]]]中知道是否包含密钥?

时间:2014-06-13 12:06:38

标签: java scala dictionary collections playframework

我想知道request.body.asFormUrlEncoded是否包含deviceId

val formValues=request.body.asFormUrlEncoded
val number = formValues.get("mobile").head
var deviceId ="deviceIdNotFound"
if(condtion) //thats the problem
deviceId= formValues.get("deviceId").head

是否存在任何关于Option[Map[String,Seq[String]]]

的conatins或任何其他函数的方法

1 个答案:

答案 0 :(得分:10)

我强烈建议您不要使用formValues.get("whatever"),部分原因是语法非常混乱 - 看起来您正在使用关键参数调用get(例如在地图上) ),当你真正在get上调用Option时(这是一个不安全的操作 - 你应该基本上始终远离get Option)然后{{ 1}}在结果地图上(也是不安全的)。这个混乱是斯卡拉的错,不是你的错,但你仍然想避免踩到它。

相反,您可以在地图上applyexists上使用Option。这是一个略微简化的例子:

contains

仅当val containsKey = formValues.exists(_.contains(key)) 非空其包含的地图具有密钥时,才会返回true

更好的方法是避免Option这样的声明:

if

如果原始val os: Option[Seq[String]] = for { m <- formValues v <- m.get(key) } yield v os.foreach { v => \\ do something with the value } 非空且地图中包含该密钥,我们最终会得到一个Option,其中包含key指向的值。