2014-02-23 64 views
2

我有下面的代码获取参数,如果它是有效的ObjectId,将其转换为Option [ObjectId],否则返回None。我怎样才能简化这个Scala选项的使用

我在想如何简化,但没有发现什么特别好。

注:params.get( “desiredImage”)是选项[字符串]

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

回答

6

您可以使用filter

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

在更少的精神,你应该能够在isValid方法传递为'PARAMS .get(“imageId”)filter(ObjectId.isValid)' – Andy

+1

我认为你的解决方案还需要一张地图来创建ObjectId –

+0

@IsmaelAbreu - 谢谢,我已经更新了答案。 – Lee

7

您还可以使用收集到做一个单一的操作:

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

你也可以使用一个用于理解:

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

为了你自己的代码你有一个不错的选择,通过使用case ... if削减它一点:

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