使用Scala和Play Framework中的选项,是否有更简洁的方法来检查x数量的变量?
if (a.isDefined || b.isDefined || c.isDefined || d.isDefined ...) {
}
像(a,b,c,d).isDefined
这样的单行可能吗?
由于
答案 0 :(得分:13)
在我的头顶上,可能有更好的方式:
List(a, b, c, d).exists(_.isDefined)
对于and
s(来自Rob Starling评论):
List(a, b, c, d).forall(_.isDefined)
您还可以拥有更复杂的条件组合:
// (a || b) && (c || d)
List(
List(a, b).exists(_.isDefined),
List(c, d).exists(_.isDefined)
).forall(identity)
// (a && b) || (c && d)
List(
List(a, b).forall(_.isDefined),
List(c, d).forall(_.isDefined)
).exists(identity)
等等。
答案 1 :(得分:1)
考虑到您似乎在playframework中,并且您可能不仅想要检查/或值是否已定义,而且还使用它们,您可以使用以下代码使用play框架的类型类而不使用scalaz。
import play.api.libs.functional._
import play.api.libs.functional.syntax._
implicit def optionInstance[A] = new Applicative[Option] with Alternative[Option] {
override def pure[A](a: A): Option[A] = Option(a)
override def apply[A, B](mf: Option[(A) => B], ma: Option[A]): Option[B] = for {
f <- mf
a <- ma
} yield f(a)
override def map[A, B](m: Option[A], f: (A) => B): Option[B] = m map f
override def app: Applicative[Option] = this
override def `|`[A, B >: A](alt1: Option[A], alt2: Option[B]): Option[B] = {
(alt1, alt2) match {
case (Some(_), None) => alt1
case (None, Some(_)) => alt2
case _ => None
}
}
override def empty: Option[Nothing] = None
}
// examples
val optI = Option(3)
val optS = Option("Hello")
val optNone : Option[String] = None
(optI and optS ) {(i, s) => s"$i $s"}
(optI and optS and (optNone or Option("world")) ) { (i,s,w) => s"$i $s $w"}
答案 2 :(得分:0)
在美学基础上:
scala> val a,b = Some(7)
a: Some[Int] = Some(7)
b: Some[Int] = Some(7)
scala> val c,d: Option[Int] = None
c: Option[Int] = None
d: Option[Int] = None
scala> a orElse b isDefined
res0: Boolean = true
scala> c orElse d isDefined
res1: Boolean = false
scala> a orElse c isDefined
res2: Boolean = true
我可以整天这样做。
scala> c orElse d orElse a orElse b isDefined
res3: Boolean = true
是的,只是检查一下我可以整天做。