Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:嵌套的getOrElse_Scala_Scala Option - Fatal编程技术网

Scala:嵌套的getOrElse

Scala:嵌套的getOrElse,scala,scala-option,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 el

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

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)))
}
但我正在努力使这种方法适用于任何大小的阵列。有什么想法吗


谢谢

具有
collectFirst

def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
  options.find(_.isDefined).flatten.getOrElse(defaultValue)
}
def customGetOrElse[T](options: Array[Option[T]], defaultValue: T): T =
 options.collectFirst { case Some(value) => value }.getOrElse(defaultValue)
Scala REPL
选项
上使用
展平
,将
选项
减少为具有值的选项。然后使用
headOption
返回包含第一个值的
选项
,或
。最后,从
选项中获取值
T
,或返回
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

为什么在一开始就找到了一些[T]
之后还要折叠整个
数组呢?@SarveshKumarSingh你说得对!编辑了答案
collectFirst
是通往失败之路!我专注于嵌套getOrElse,我完全忘记了使用find。谢谢为什么要展平整个阵列?非空选项可能是第一个或第二个选项,平坦操作本身将是O(n)。我只是想把事情弄得恰到好处,而不是表演。
scala> customGetOrElse[Int](Array(None, None), 666)
res29: Int = 666

scala> customGetOrElse[Int](Array(None, Some(42)), 666)
res30: Int = 42