![](/img/trans.png)
[英]How would I implement an Interceptor/Filter in play framework 2.4.3 (Scala)
[英]How to implement “or” in a scala filter?
我正在尝试在scala中实现“或”过滤列表。
list.filter(_ % 3 ==0 || _ % 5 ==0)
但我收到这个错误:
错误:参数数量错误; 预期= 1
那么如何将其分组为一个参数。
不要试图比你更简洁:
list.filter(x => x % 3 ==0 || x % 5 ==0)
下划线不起作用,因为第n个_被扩展为第n个参数,如下所示:
list.filter((x,y) => x % 3 ==0 || y % 5 ==0)
如果参数仅在函数表达式中出现一次,则只能使用占位符语法。 否则,您必须显式声明函数参数:
list.filter(x => x % 3 == 0 || x % 5 == 0)
多个占位符扩展为多个方法参数。
最简单的解决方案是使用:
list.filter(x => (x % 3 == 0) || (x % 5 == 0))
如果你想获得幻想并实现一个“或”,看看我是如何用一些拉皮条做的: Predicates 。 提供皮条客的简单解决方案是:
trait Pred1[A] extends (A => Boolean){
self =>
def or[AA >: A](that: AA => Boolean) = new Pred1[A]{
def apply(arg: A) = self(arg) || that(arg)
}
}
//and somewhere in the code
implicit def f2p[A](f: A => Boolean) = new Pred1[A]{ def apply(arg: A) = f(arg) }
等等“和”,“xor”,“nxor”,“nor”和“nand”。 那么你所做的只是提出你传递给过滤器的两个函数。
请注意,我可能正在用类型类替换拉皮条,并在另一个分支中玩弄一些想法,但几乎没有空闲时间真正深入研究它。
功能替代:
val or = (xs: List[Int => Boolean]) => (x: Int) => xs.exists(_(x))
List(0, 1, 2, 3, 4, 5, 6).filter(or(List(_ % 3 == 0, _ % 5 == 0)))
甚至更简单:
val or = { def or(xs: (Int => Boolean)*) = (x: Int) => xs.exists(_(x)); or _}
List(0, 1, 2, 3, 4, 5, 6).filter(or(_ % 3 == 0, _ % 5 == 0))
更新 :第二个版本似乎不适用于Scala 2.10,所以最好使用方法:
def or[T](xs: (T => Boolean)*) = (x: T) => xs.exists(_(x))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.