在Scala中进行部分匹配的正确方法是什么?
我有一个在Scala中进行部分匹配的正确方法是什么?,scala,Scala,我有一个Properties对象,如果配置包含一个特定的键,我想做些什么。如果这个键不存在,我只想忽略它。我试过以下方法: myProps getProperty "foo" match { case v if v != null => doSomethingWith v } 但是如果properties对象不包含foo,则会导致MatchError 我可以想出两种方法来解决这个问题。方法1是: myProps getProperty "foo" match { case v i
Properties
对象,如果配置包含一个特定的键,我想做些什么。如果这个键不存在,我只想忽略它。我试过以下方法:
myProps getProperty "foo" match {
case v if v != null => doSomethingWith v
}
但是如果properties对象不包含foo
,则会导致MatchError
我可以想出两种方法来解决这个问题。方法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,因为它只查询了一次属性
,并且注释表明故意忽略了不匹配项,但这也是非常冗长的。方法2有一个缺陷,除了两次查询属性
之外,如果在不久的将来密钥被更改,它必须在两个地方被更改,这是bug的来源
那么,有没有一种更好的方法可以像方法1那样,但要短一些,或者是这样做的?尝试将函数包装到
选项中
Option(myProps getProperty "foo").map {
v => doSomethingWith v
}
选项(myProps getProperty“foo”)
将返回Some(propertyValue)
或None
。只有当结果是Some(propertyValue)
,才会执行代码中带有(v)
的dosomething。如果没有,则将忽略它
如果使用选项
上的getOrElse
函数,结果为无,则也可以使用默认值
正如@VladimirMatveev在评论中提到的那样,map
如果方法doSomethingWith
有副作用,那么就不是正确的做法。改用foreach
。尝试在选项中包装函数
Option(myProps getProperty "foo").map {
v => doSomethingWith v
}
选项(myProps getProperty“foo”)
将返回Some(propertyValue)
或None
。只有当结果是Some(propertyValue)
,才会执行代码中带有(v)
的dosomething。如果没有,则将忽略它
如果使用选项
上的getOrElse
函数,结果为无,则也可以使用默认值
正如@VladimirMatveev在评论中提到的那样,map
如果方法doSomethingWith
有副作用,那么就不是正确的做法。改用foreach
。尝试在选项中包装函数
Option(myProps getProperty "foo").map {
v => doSomethingWith v
}
选项(myProps getProperty“foo”)
将返回Some(propertyValue)
或None
。只有当结果是Some(propertyValue)
,才会执行代码中带有(v)
的dosomething。如果没有,则将忽略它
如果使用选项
上的getOrElse
函数,结果为无,则也可以使用默认值
正如@VladimirMatveev在评论中提到的那样,map
如果方法doSomethingWith
有副作用,那么就不是正确的做法。改用foreach
。尝试在选项中包装函数
Option(myProps getProperty "foo").map {
v => doSomethingWith v
}
选项(myProps getProperty“foo”)
将返回Some(propertyValue)
或None
。只有当结果是Some(propertyValue)
,才会执行代码中带有(v)
的dosomething。如果没有,则将忽略它
如果使用选项
上的getOrElse
函数,结果为无,则也可以使用默认值
正如@VladimirMatveev在评论中提到的那样,map
如果方法doSomethingWith
有副作用,那么就不是正确的做法。请改用foreach
。一般来说,如果调用的Java方法可能返回null
,则应始终通过将其包装在选项(…)
中来强制其为正确的类型。如果myProps是Map类型,则可以使用方法get来获取选项,因此无需自行包装no no,如果doSomethingWith
有副作用(似乎是这样),则不使用map
,而是使用foreach
。“这里的操作差异很小,但语义差异很大。”弗拉基米尔马维耶夫同意。更新了应答作为一般规则,如果您调用的Java方法可能返回null
,则应始终通过将其包装在选项(…)
中,将其强制为正确的类型。如果myProps的类型为Map,则可以使用方法get来获取选项,因此无需自行包装no,如果doSomethingWith
有副作用(似乎是这样),则不使用map
,而是使用foreach
。“这里的操作差异很小,但语义差异很大。”弗拉基米尔马维耶夫同意。更新了应答作为一般规则,如果您调用的Java方法可能返回null
,则应始终通过将其包装在选项(…)
中,将其强制为正确的类型。如果myProps的类型为Map,则可以使用方法get来获取选项,因此无需自行包装no,如果doSomethingWith
有副作用(似乎是这样),则不使用map
,而是使用foreach
。“这里的操作差异很小,但语义差异很大。”弗拉基米尔马维耶夫同意。更新了应答作为一般规则,如果您调用的Java方法可能返回null
,则应始终通过将其包装在选项(…)
中,将其强制为正确的类型。如果myProps的类型为Map,则可以使用方法get来获取选项,因此无需自行包装no,如果doSomethingWith
有副作用(似乎是这样),则不使用map
,而是使用foreach
。“这里的操作差异很小,但语义差异很大。”弗拉基米尔马维耶夫同意。更新了答案