Scala过滤器和多个谓词报告

时间:2017-06-11 04:26:48

标签: scala scala-collections

我有4个谓词

  private def pred1(ep:MyClass):Boolean = ep.attr1.contains(true) && func1(ep)
  private def pred2(ep:MyClass):Boolean = ep.attr1.contains(true) && !func1(ep)
  private def pred3(ep:MyClass):Boolean = ep.attr1.contains(false) && func2(ep)
  private def pred4(ep:MyClass):Boolean = ep.attr1.contains(false) && !func2(ep)

然后我有一个列表,我希望按照这样的每个谓词进行过滤。

val ep: Seq[MyClass] = ???

val v1 = es.filter(pred1)
val v2 = es.filter(pred2)
val v3 = es.filter(pred3)
val v4 = es.filter(pred4)

如何在单个过滤器中使用正确的谓词获取v1, v2, v3, v4的值并将其报告为4 tuple (v1,v2,v3,v4)?或类似的东西。我不想这样做4次。我有一个巨大的序列,这没有优化

1 个答案:

答案 0 :(得分:3)

你可以使用这样的折叠..

  ep.foldLeft[(Seq[MyClass], Seq[MyClass], Seq[MyClass], Seq[MyClass])]
              ((Nil,Nil,Nil,Nil)) { case ((a,b,c,d), i) =>
    (
      if (pred1(i)) a :+ i else a,
      if (pred2(i)) b :+ i else b,
      if (pred3(i)) c :+ i else c,
      if (pred4(i)) d :+ i else d
    )
  }