简化if(x)Some(y)else None?

Tim*_*Tim 29 scala

这种常见的模式感觉有点冗长:

if (condition) 
  Some(result)
else None
Run Code Online (Sandbox Code Playgroud)

我在考虑使用一个函数来简化:

def on[A](cond: Boolean)(f: => A) = if (cond) Some(f) else None
Run Code Online (Sandbox Code Playgroud)

这将顶部示例缩减为:

on (condition) { result }
Run Code Online (Sandbox Code Playgroud)

这样的事情已经存在吗?或者这有点矫枉过正?

dre*_*xin 24

您可以创建第Option一个并根据您的条件过滤:

Option(result).filter(condition)
Run Code Online (Sandbox Code Playgroud)

或者如果condition与...无关result

Option(result).filter(_ => condition)
Run Code Online (Sandbox Code Playgroud)

  • 有趣!虽然我有点担心(a)条件/结果的意外(对我而言),以及(b)总是计算"结果"的倾向,无论是否需要.但是,没有想到这一点!谢谢! (4认同)

Ben*_*mes 18

Scalaz包含选项功能:

import scalaz.syntax.std.boolean._

true.option("foo") // Some("foo")
false.option("bar") // None
Run Code Online (Sandbox Code Playgroud)


Xav*_*hot 10

现在,随构建器提供了Starting Scala 2.13,它可以执行以下操作:Optionwhen

Option.when(condition)(result)
Run Code Online (Sandbox Code Playgroud)

例如:

Option.when(true)(45)
// Option[Int] = Some(45)
Option.when(false)(45)
// Option[Int] = None
Run Code Online (Sandbox Code Playgroud)

另请注意,耦合unless方法的作用相反。

  • 现在 Scala 2.13 已经发布了,这就是我们要走的路。 (2认同)