假设我有两个函数foo: Int => Option[Int],bar: Int => Option[Int]并使用它们来处理列表:
val xs: List[Int] = ...
xs flatMap {x => foo(x) orElse bar(x)}
Run Code Online (Sandbox Code Playgroud)
我可以写xs flatMap (foo orElse bar)而不是{x => foo(x) orElse bar(x)}吗?
我可以使用3d派对库.
据我所知,标准库中没有这样的东西,但您可以使用隐式类自己添加:
implicit class WithOrElse[T, R](f: T => Option[R]) {
def orElse(g: T => Option[R])(x: T) = f(x) orElse g(x)
}
Run Code Online (Sandbox Code Playgroud)
例:
val foo: Int => Option[Int] = x => if (x % 2 == 0) Some(x) else None
val bar: Int => Option[Int] = x => if (x % 3 == 0) Some(x) else None
val xs = List(1, 2, 3, 4, 5, 6, 7, 8)
xs flatMap (foo orElse bar)
Run Code Online (Sandbox Code Playgroud)