Scala筛选器和多谓词报告

Scala筛选器和多谓词报告,scala,scala-collections,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) &

我有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元组(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
    )
  }

谢谢,这看起来很有帮助。我将测试它,我相信它会工作。我试图调用map,我想我会遇到的问题是,它不会在我尝试过的情况下放置任何对象或()。我认为这是不可能做到这一点的地图。下面是我尝试过的val result=es.map{x=>val v1=if(pred1(x))Some(x)else None val v2=if(pred2(x))Some(x)else None val v3=if(pred3(x))Some(x)else None val v4=if(pred4(x))Some(x)else None}