假设我有一个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))
这感觉更好,但现在我坚持一个第二(虽然简单)操作而进行我的序列的每个元素。我可以希望它会被优化,但这仍然不完美。
我想要的是缺少任何缺陷的东西。感觉应该有一个很好的方式来实现它 - 任何想法?
是的;出于某种原因,我没有看到扭转局势的想法。这非常整齐。 – Submonoid 2012-02-07 17:35:11
为什么需要将模式“option.map()。getOrElse()”添加到标准库中的另一个原因。它总是我皮条客的第一件事之一。 – 2012-02-07 17:38:11
@DaveGriffith - 确实。我也有,叫'fold'(就像Scalaz),语法为'o.map(f).getOrElse(b)'成为'o.fold(b)(f)'。 – 2012-02-07 18:29:31