在javascript中,我们可以执行以下操作:
value = f1() || f2() || f3();
Run Code Online (Sandbox Code Playgroud)
这将调用f1,如果结果不为null,则将其赋值给value.只有当结果为null时,它才会调用f2,并且如果它不为null,则将其赋值给value....
这里给出了一种在scala中实现这一点的方法:如何使这个first-not-null-result函数更加优雅/简洁? 创建一个getFirstNNWithOption函数,调用每个函数直到非null:
value = getFirstNNWithOption(List(f1 _, f2 _, f3 _))
Run Code Online (Sandbox Code Playgroud)
但是,这不如javascript ||那么好 运营商,更灵活.例如:
value = f1() || f2(3) || f3(44, 'ddd') || value4;
Run Code Online (Sandbox Code Playgroud)
有没有办法在scala中实现这一点?
and*_*lla 11
因为你正在使用函数返回Option.
最好的解决方案是使用链接选项,就像这里解释选项的链接一样
所以你会这样做
f1().orElse(f2()).orElse(f3()).orElse(Some(4))
Run Code Online (Sandbox Code Playgroud)
我使用推荐Option而不是null.
例如:
class OptionPimp[T](o: Option[T]) {
def ||(opt: => Option[T]) = o orElse opt
def ||(t: => T) = o getOrElse t
}
implicit def optionPimp[T](o: Option[T]) = new OptionPimp(o)
def f1(): Option[Int] = None
def f2(): Option[Int] = None
def f3(): Option[Int] = Some(3)
val value1 = f1() || f2() || f3() || 4 // yields 3
val value2 = f1() || f2() || 4 // yields 4
Run Code Online (Sandbox Code Playgroud)
如果您将此函数与可能返回null的函数一起使用,您还可以定义一个空合并运算符:
class NullOption[A <: AnyRef](a: A) {
def |?|[B >: A](b: => B) = if (a ne null) a else b
}
implicit def null_handling[A <: AnyRef](a: A) = new NullOption(a)
Run Code Online (Sandbox Code Playgroud)
它的工作原理就像Javascript一样.(我使用的目的|?|是为了避免将其误认为布尔逻辑或者,但||如果您愿意,可以使用.)这样可以更好 - 几乎像 - Option如果您添加条件映射(此处命名为?--pick您最喜欢的单词或符号):
class NullOption[A <: AnyRef](a: A) {
def |?|[B >: A](b: => B) = if (a ne null) a else b
def ?[C >: Null](f: A => C): C = if (a ne null) f(a) else null
}
implicit def null_handling[A <: AnyRef](a: A) = new NullOption(a)
Run Code Online (Sandbox Code Playgroud)
然后你可以
scala> val s: String = null
s: String = null
scala> val t: String = "foo"
t: String = foo
scala> s?(_.toUpperCase) |?| t |?| { println("I am not executed"); "bar" }
res4: java.lang.String = "foo"
Run Code Online (Sandbox Code Playgroud)
当然,你的类型系统不会帮助你记住你需要处理那些没有数据的情况,但它可以使空处理稍微更愉快(至少只要没有原语;使用原语,返回null-or-primitive实际上没有意义).
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |