在Scala中进行部分匹配的正确方法是什么?

时间:2015-05-12 08:51:56

标签: scala

我有一个Properties对象,如果配置包含特定键,则想要执行某些操作。如果此密钥不存在,我只想忽略它。我尝试了以下方式:

myProps getProperty "foo" match {
  case v if v != null => doSomethingWith v
}

但如果属性对象不包含MatchError,则会导致foo

我可以想出两种方法来解决这个问题。方法1是:

myProps getProperty "foo" match {
  case v if v != null => doSomethingWith v
  case _ => // ignore if foo does not exist
}

方法2是:

if(myProps containsKey "foo") doSomethingWith(myProps getProperty "foo")

就个人而言,我更喜欢方法1,因为它只查询Properties一次,而评论告诉我们故意忽略不匹配,但这也很冗长。方法2有一个缺点,除了查询Properties两次之外,如果在不久的将来密钥被更改,它必须在这里的两个地方进行更改,这是错误的来源。

那么,有没有更好的方法像方法1那样做,但更短,或者是这样做的?

1 个答案:

答案 0 :(得分:3)

尝试在 x.remove(y); x.add(z); x.repaint(); x.revalidate(); 中包装您的函数。

Option

Option(myProps getProperty "foo").map { v => doSomethingWith v } 将返回Option(myProps getProperty "foo")Some(propertyValue)。仅当结果为None时,才会执行代码中的Some(propertyValue)。如果是None,则会被忽略。

使用doSomethingWith (v)上的getOrElse功能,如果结果为无,您也可以使用默认值。

正如@VladimirMatveev的评论中提到的,如果方法Option有副作用,map不是正确的做法。请改用doSomethingWith