假設我有一個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