Pab*_*lgo 11 scala scala-option
大多数SQL实现(这个问题与SQL无关,它只是一个例子)提供函数COALESCE(x1,x2,...,xn),x1如果不是则返回NULL,x2否则只有在x2不是NULL等等的情况下才返回.如果所有xi值都是NULL结果则是NULL.
我希望COALESCE在Scala中获得类似SQL的内容,以便将Option值NULL替换为None.我会举几个例子:
> coalesce(None,Some(3),Some(4))
res0: Some(3)
> coalesce(Some(1),None,Some(3),Some(4))
res1: Some(1)
> coalesce(None,None)
res2: None
Run Code Online (Sandbox Code Playgroud)
所以我把它实现为:
def coalesce[T](values: Option[T]*): Option[T] =
(List[T]() /: values)((prev: List[T], cur: Option[T]) =>
prev:::cur.toList).headOption
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我想知道是否已经存在类似于Scala的一部分实现的功能.
Mic*_*jac 13
更短,你可以使用collectFirst.这将在一个步骤中执行,最多一次遍历集合.
def coalesce[A](values: Option[A]*): Option[A] =
values collectFirst { case Some(a) => a }
scala> coalesce(Some(1),None,Some(3),Some(4))
res15: Option[Int] = Some(1)
scala> coalesce(None,None)
res16: Option[Nothing] = None
Run Code Online (Sandbox Code Playgroud)
怎么样:
values.flatten.headOption
Run Code Online (Sandbox Code Playgroud)
这样可以Option隐式转换为Iterable,因此flatten与列表列表的工作方式相同.
自动应答:
本机机制(没有实现coalesce函数)是对orElse方法的调用的链接:
> None.orElse(Some(3)).orElse(Some(4))
res0: Option[Int] = Some(3)
> Some(1).orElse(None).orElse(Some(3)).orElse(Some(4))
res1: Option[Int] = Some(1)
> None.orElse(None)
res2: Option[Nothing] = None
Run Code Online (Sandbox Code Playgroud)