Scala 过滤器和多个谓词报告

Scala filter and multiple predicates reporting

我有 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 次。我有一个巨大的序列,但没有优化

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

  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
    )
  }