我如何简化此Scala选项的使用

时间:2014-02-23 19:39:56

标签: scala

我有以下代码获取参数,如果它是有效的ObjectId,则将其转换为Option [ObjectId],否则返回None。

我在想它如何简化,但没有找到更好的东西。

注意:params.get(" desiredImage")是Option [String]

val imageId: Option[ObjectId] = params.get("imageId") match {
  case None => None
  case Some(x) => {
    if (ObjectId.isValid(x)) {
      Some(new ObjectId(x))
    } else {
      None
    }
  }
}

4 个答案:

答案 0 :(得分:7)

您也可以使用collect在一次操作中执行此操作:

val imageId: Option[ObjectId] = params.get("imageId") collect { 
  case x if ObjectId.isValid(x) => new ObjectId(x) 
}

答案 1 :(得分:6)

您可以使用filter

val imageId: Option[ObjectId] = params.get("imageId")
       .filter (ObjectId.isValid)
       .map(new ObjectId(_))

答案 2 :(得分:3)

你也可以使用for comprehension:

val imageId  = for ( x <- params.get("imageId") if ObjectId.isValid(x)) 
                   yield new ObjectId(x)

答案 3 :(得分:0)

对于您自己的代码,您可以选择使用case ... if进行一些简单的删除:

val imageId: Option[ObjectId] = params.get("imageId") match {
  case Some(x) if ObjectId.isValid(x) => Some(new ObjectId(x))
  case _ => None
}