Scala:嵌套的 getOrElse
Scala : Nested getOrElse
我想创建一个方法,它将一个选项数组和一个默认值作为参数,return 第一个非空选项,否则默认值:
def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
// Example if options contain 2 elements
options(0).getOrElse(options(1).getOrElse(defaultValue))
// If options contain 3 elements
options(0).getOrElse(options(1).getOrElse(options(2).getOrElse(defaultValue)))
}
但我正在努力使这种方法适用于任何大小的数组。有什么想法吗?
谢谢!
def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
options.find(_.isDefined).flatten.getOrElse(defaultValue)
}
collectFirst
def customGetOrElse[T](options: Array[Option[T]], defaultValue: T): T =
options.collectFirst { case Some(value) => value }.getOrElse(defaultValue)
Scala REPL
Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_162).
Type in expressions for evaluation. Or try :help.
scala> :paste
// Entering paste mode (ctrl-D to finish)
def customGetOrElse[T](options: Array[Option[T]], defaultValue: T): T =
options.collectFirst { case Some(value) => value }.getOrElse(defaultValue)
// Exiting paste mode, now interpreting.
customGetOrElse: [T](options: Array[Option[T]], defaultValue: T)T
scala> customGetOrElse[Int](Array(None, Some(1)), 2)
res0: Int = 1
scala> customGetOrElse[Int](Array(None, None), 2)
res1: Int = 2
在 options
上使用 flatten
将 options
减少为具有值的那些。然后使用 headOption
到 return 包含第一个值的 Option
或 None
。最后,从 Option
或 return 和 defaultValue
.
中获取值 T
def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
options.flatten.headOption.getOrElse(defaultValue)
}
示例:
scala> customGetOrElse[Int](Array(None, None), 666)
res29: Int = 666
scala> customGetOrElse[Int](Array(None, Some(42)), 666)
res30: Int = 42
我想创建一个方法,它将一个选项数组和一个默认值作为参数,return 第一个非空选项,否则默认值:
def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
// Example if options contain 2 elements
options(0).getOrElse(options(1).getOrElse(defaultValue))
// If options contain 3 elements
options(0).getOrElse(options(1).getOrElse(options(2).getOrElse(defaultValue)))
}
但我正在努力使这种方法适用于任何大小的数组。有什么想法吗?
谢谢!
def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
options.find(_.isDefined).flatten.getOrElse(defaultValue)
}
collectFirst
def customGetOrElse[T](options: Array[Option[T]], defaultValue: T): T =
options.collectFirst { case Some(value) => value }.getOrElse(defaultValue)
Scala REPL
Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_162).
Type in expressions for evaluation. Or try :help.
scala> :paste
// Entering paste mode (ctrl-D to finish)
def customGetOrElse[T](options: Array[Option[T]], defaultValue: T): T =
options.collectFirst { case Some(value) => value }.getOrElse(defaultValue)
// Exiting paste mode, now interpreting.
customGetOrElse: [T](options: Array[Option[T]], defaultValue: T)T
scala> customGetOrElse[Int](Array(None, Some(1)), 2)
res0: Int = 1
scala> customGetOrElse[Int](Array(None, None), 2)
res1: Int = 2
在 options
上使用 flatten
将 options
减少为具有值的那些。然后使用 headOption
到 return 包含第一个值的 Option
或 None
。最后,从 Option
或 return 和 defaultValue
.
T
def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
options.flatten.headOption.getOrElse(defaultValue)
}
示例:
scala> customGetOrElse[Int](Array(None, None), 666)
res29: Int = 666
scala> customGetOrElse[Int](Array(None, Some(42)), 666)
res30: Int = 42