2014-02-23 95 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 
} 
相關問題