scala - 有条件地过滤一个序列

标签 scala

假设我有一个 Option[A => Boolean] , 一个 List[A] ,以及我想在该列表的子集上执行的一些操作。如果设置了该选项,那么我想先过滤列表,然后应用我的操作。如果没有,那么我想将它应用于整个列表。一个例子:

val a : Option[Int => Boolean] = Option((a : Int) => a % 2 == 0)
val b = 1 to 100

我可以轻松地做到以下几点:
val c = if (a.isDefined) b.filter(a.get) else b

但是,这涉及到调用 a.get ;太多的条件让我无法做到这一点!我也可以这样做:
val c = b.filter(a.getOrElse(_ => true))

这感觉更好,但现在我被困在为我的序列的每个元素执行第二次(尽管微不足道)操作。我希望它会被优化,但这仍然感觉不完美。

我想要的是缺少任何一个缺陷的东西。感觉应该有一个很好的方法来做到这一点 - 有什么想法吗?

最佳答案

您只需要使用正常的选项处理方法:

a.map(b.filter).getOrElse(b)

关于scala - 有条件地过滤一个序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180812/

相关文章:

scala - 使用 <> 在 Scala 中模拟 !=

java - 通过反射修改不可变的scala类字段

java - 使用 Java 中的 Scala 集合出现问题

scala - Scala 2.10.6 没有类型级别编译器

scala - 如何根据相互遵循的不同条件构建 Seq

scala - 使用 Spark 将对象发送到特定分区

algorithm - 从至少有两个元素相等的列表中找出所有最大的子列表

scala - 从选项中的类型方法生成部分应用的函数

启动 Play 项目时出现java.lang.UnsatisfiedLinkError

scala - sbt项目添加依赖时需要生成.ensime目录吗?