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

Gov*_*ngh 5 java collections dictionary scala 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
Run Code Online (Sandbox Code Playgroud)

是否有任何方式的conatins或任何其他功能 Option[Map[String,Seq[String]]]

Tra*_*own 10

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

相反,你可以在地图existsOption一起使用contains.这是一个略微简化的例子:

val containsKey = formValues.exists(_.contains(key))
Run Code Online (Sandbox Code Playgroud)

true只有当Option它非空并且它包含的地图具有键时,才会返回.

更好的方法是避免if像这样的-statement:

val os: Option[Seq[String]] = for {
  m <- formValues
  v <- m.get(key)
} yield v

os.foreach { v => \\ do something with the value }
Run Code Online (Sandbox Code Playgroud)

在这里,我们最终得到一个Option包含指向的值,key如果原始Option非空,并且地图包含该键.