如何处理地图查找和检查值

时间:2017-06-25 02:50:47

标签: scala dictionary

我需要修复此声明,因为它没有使用使用该选项的.get方法。

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

  ..
}

我想使用以下方法以正确的方式进行查找:

map.get(myKey)

但我无法正确理解语法。

2 个答案:

答案 0 :(得分:2)

我认为这实现了你追求的逻辑。

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

使用fold解包Option并为SomeNone提供不同的分支。

答案 1 :(得分:1)

您可以使用map

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

map将函数应用于Option并返回另一个Option。在上面的代码中,map将函数_ == file.getTimestamp.getTime.toString应用于map.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在另一个回答中的评论在致电map后使用getOrElse

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

这就是getOrElse的工作原理:

  • 如果map操作的结果是Some,则返回Some的值。因此,返回truefalse
  • 如果map操作的结果是None,则会返回传递给getOrElse的默认值 - 在本例中为true -

如果您选择使用map来解决问题,我会采用@YuvalItzchakov提供的getOrElse方法。