Scala使多个选项检查更简洁

时间:2014-08-01 16:14:16

标签: scala playframework playframework-2.0

使用Scala和Play Framework中的选项,是否有更简洁的方法来检查x数量的变量?

if (a.isDefined || b.isDefined || c.isDefined || d.isDefined ...) {

}

(a,b,c,d).isDefined这样的单行可能吗?

由于

3 个答案:

答案 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

是的,只是检查一下我可以整天做。