Scala:嵌套的getOrElse

时间:2018-06-06 17:47:28

标签: scala scala-option

我想创建一个方法,将参数数组和默认值作为参数,并返回第一个非空选项,否则为默认值:

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)))
}

但我正在努力使这个方法适用于任何大小的数组。有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
  options.find(_.isDefined).flatten.getOrElse(defaultValue)
}

答案 2 :(得分:1)

flatten上使用optionsoptions缩减为具有值的headOption。然后使用Option返回包含第一个值或None的{​​{1}}。最后,从T获取值Option或返回defaultValue

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