对 Scala Option 的值(如果存在)调用方法

Joe*_*jr2 7 scala scala-option

我试图找出重构以下代码以消除 Option.get() 的使用的最佳方法。我知道使用 get 方法被认为是不好的做法。

if (myConnection.isDefined) {
  myConnection.get.close
}
Run Code Online (Sandbox Code Playgroud)

其中 myConnection 的类型为 Option[Connection]

getOrElse 似乎不起作用,因为没有“else”对象可以调用该方法。如果 myConnection 是 None,那么我不想做任何事情。

我想我可以使用 forEach 像:

myConnection.foreach{ c => c.close }
Run Code Online (Sandbox Code Playgroud)

这可行,但对我来说看起来很奇怪。就我而言,myConnection 永远不会包含多个连接,其他人稍后查看我的代码可能会相信它可以包含多个连接。

有没有更好的方法来做到这一点既简洁又清晰?

pra*_*upd 5

foreachunit当您使用返回值和副作用进行计算时,这是有意义的。关闭连接对 foreach我来说听起来不错。

看起来像这样Option.foreach

@inline final def foreach[U](f: A => U) {
  if (!isEmpty) f(this.get)
}
Run Code Online (Sandbox Code Playgroud)

但如果你想做一些计算并返回值,.map或者match可能会更好。

import scala.util.Try

val connectionMaybe = Try {
  DriverManager.getConnection(
    s"jdbc:h2:~/test;MODE=Oracle",
    "sa",
    ""
  )
}.toOption


def getSomething(connectionMaybe: Option[Connection]): Option[Int] = {
  connectionMaybe match {
    case Some(connection) =>
      val statement = connection.createStatement()
      val rs = statement.executeQuery(s"select * from something")
      Option(rs.getInt("some_column"))
      //cleanup if needed
    case _ =>
      println("no connection found")
      None
  }
}
Run Code Online (Sandbox Code Playgroud)


Met*_*lis 3

通常,您可以映射一个选项来对其值进行操作。

myConnection.map(c => c.close())
Run Code Online (Sandbox Code Playgroud)

或者

myConnection.map(close(_))
Run Code Online (Sandbox Code Playgroud)

None 如果 c 是并且将返回 a ,则它将不执行任何操作None。否则,它会给你一个Some(True)if,例如,成功时close()返回 a 。True如果close()没有返回值,则映射将返回Some(())类型为 的a Option[Unit]