2017-06-25 42 views
-1

我需要修復此語句,因爲它沒有使用使用Option的.get方法。如何處理查看和檢查值的地圖

if(!map.contains(myKey) || 
    map(myKey) == file.getTimestamp.getTime.toString) { 

    .. 
} 

我想做的查詢使用正確的方法:

map.get(myKey) 

但我不能得到正確的語法。

回答

1

你可以使用map

map.get(myKey).map(_ == file.getTimestamp.getTime.toString) 

map應用一個函數的Option並返回另一個Option。在上面的代碼,map應用功能_ == file.getTimestamp.getTime.toStringmap.get(myKey)結果:

  • 如果map.get(myKey)Some,爲myKey意思是值存在於地圖上,然後我們檢查值是否等於file.getTimestamp.getTime.toString。如果該值等於該字符串,則返回Some(true);否則我們會返回一個Some(false)
  • 如果map.get(myKey)None,意思是地圖中不存在myKey的值,則返回None

下面的模式匹配說明了一種方法來提取的方式map操作的結果是在你的問題if說法一致:

map.get(myKey).map(_ == file.getTimestamp.getTime.toString) match { 
    case None | Some(true) => ... 
    case _ => ... 
} 

@ YuvalItzchakov在另一個答案評論使用getOrElse調用map後:

map.get(myKey).map(_ == file.getTimestamp.getTime.toString).getOrElse(true) 

這是怎麼getOrElse作品:

  • 如果map操作的結果是一個Some,則返回Some的值。因此返回truefalse
  • 如果map操作的結果是None,則返回傳遞給getOrElse的默認值 - 在本例中爲true - 。

如果您選擇使用map來解決你的問題,我會去與@YuvalItzchakov提供了getOrElse方法。

+0

儘管這段代碼可能會回答這個問題,但提供額外的[context ](https://meta.stackexchange.com/q/114762)關於_how_和/或_why_它解決了這個問題會提高答案的長期價值。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。它也不會提到爲什麼這個答案比其他答案更合適。 –

2

我認爲這實現了你之後的邏輯。

if (map.get(myKey).fold(true)(_ == file.getTimestamp.getTime.toString) { 
    ... 
} 

使用fold解開了OptionSomeNone提供不同的分支。

+0

有趣。是否可以使用地圖? – Blankman

+0

我相信@ Chunjef已經顯示出來了。 – jwvh

+1

@Blankman修改@chunjef回答一下:'map.get(myKey).map(_ == file.getTimestamp.getTime.toString).getOrElse(true)' –