2014-06-13 13 views
5

Tôi muốn biết số request.body.asFormUrlEncoded chứa deviceId hay không.làm thế nào để biết từ Option [Map [String, Seq [String]]] có chứa khóa hay không?

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

là có cách nào conatins hay bất kỳ chức năng khác cho Option[Map[String,Seq[String]]]

Trả lời

10

Tôi rất muốn khuyến khích bạn không nên sử dụng formValues.get("whatever"), một phần vì cú pháp là rất khó hiểu-có vẻ như bạn đang gọi điện thoại get với đối số chính (ví dụ như trên bản đồ), khi thực sự bạn đang gọi get trên Option (hoạt động không an toàn — bạn nên tránh xa get trên Option về cơ bản luôn) và sau đó apply trên bản đồ kết quả (cũng không an toàn). Mớ hỗn độn này là lỗi của Scala, không phải của bạn, nhưng bạn vẫn muốn tránh bước vào nó.

Thay vào đó bạn có thể sử dụng exists trên Option cùng với contains trên bản đồ. Dưới đây là một ví dụ hơi đơn giản:

val containsKey = formValues.exists(_.contains(key)) 

này sẽ trở lại true chỉ khi Option không bị để trống bản đồ nó chứa có chìa khóa.

Một cách tiếp cận tốt hơn là để tránh -statement if như thế này:

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

os.foreach { v => \\ do something with the value } 

Ở đây chúng ta kết thúc với một Option chứa giá trị được trỏ đến bởi key nếu bản gốc Option không bị để trống và bản đồ chứa khóa đó.

Các vấn đề liên quan