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 永远不会包含多个连接,其他人稍后查看我的代码可能会相信它可以包含多个连接。
有没有更好的方法来做到这一点既简洁又清晰?
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)
通常,您可以映射一个选项来对其值进行操作。
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]。