正确使用scala地图

oym*_*oym 0 functional-programming scala

我发现自己在Option值上使用Scala map函数,如下所示:

optionVal.map( val => {
  doSomethingWith(val)
  doSomethingElseWith(val)
  // etc. (an example could be executing a database query)
})
Run Code Online (Sandbox Code Playgroud)

其中optionVal可以是例如:

Option[String]
Run Code Online (Sandbox Code Playgroud)

换句话说,我使用它作为一种方法来确保Option填充了某些内容,如果是这样,则执行一个语句块.

对于我来自Java世界来说似乎有点奇怪和错综复杂,只会检查对象(if (someObject != null) { // execute statements}).此外,似乎它可能在语义上不是地图功能的目的,即使它有效.所以我想检查这是否是在Scala中执行此操作的正确/惯用方法.

Mic*_*jac 6

如果doSomethingwith(value)返回Unit,则可以使用foreach:

def doSomethingWith(value: Int): Unit = println(value)

val opt: Option[Int] = Some(1)

opt.foreach{ value =>
    doSomethingWith(value)  // prints the value
}

val noOpt: Option[Int] = None 

noOpt.foreach{ value =>
    doSomethingWith(value)   // Does nothing, because noOpt is empty.
}
Run Code Online (Sandbox Code Playgroud)

如果您打算映射(以某种方式返回)其中的值Option,则继续使用map.

映射OptionUnit无害,但它会使您的代码更易于使用foreach.