Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中进行部分匹配的正确方法是什么?_Scala - Fatal编程技术网

在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
。“这里的操作差异很小,但语义差异很大。”弗拉基米尔马维耶夫同意。更新了答案