Scala谓词组成

sen*_*vic 4 scala

java谓词接口提供了or一种用于组合多个谓词的方法。例:

Predicate<Integer> p1;
Predicate<Integer> p2;

Predicate<Integer> p2 = p1.or(p2)
Run Code Online (Sandbox Code Playgroud)

由于scala没有Predicate接口,但Function1[A, Boolean]为此目的使用什么是编写此接口的最佳方法?最好不使用外部库。

我尝试避免以下情况:

val p1: (A => Boolean)
val p2: (A => Boolean)

val p3: (A => Boolean) = (a => p1(a) || p2(a))
Run Code Online (Sandbox Code Playgroud)

Joe*_*ley 10

您可以Predicate在隐式值类中提供以下功能:

implicit class Predicate[A](val p1: A => Boolean) extends AnyVal {
  def or[B >: A](p2: B => Boolean) = (a: A) => p1(a) || p2(a)
}
Run Code Online (Sandbox Code Playgroud)

然后做

val gtOne = (x: Int) => x > 1
val ltMinusOne = (x: Int) => x < -1

val absGtOne = gtOne or ltMinusOne

absGtOne(-2)  // true
absGtOne(0)  // false
absGtOne(2)  // true
Run Code Online (Sandbox Code Playgroud)