2013-12-10 68 views
2

我有一組項目,讓我們稱他們爲Effect,我也有一組possibleEffects : Set[Effect]對於理解過濾選項進行

我需要通過效果列表進行迭代,只有返回的Cause列表第一個Cause我找到每個Effect。可能有重疊原因導致多個效應,這就是爲什麼結果需要在一個集合中。我需要這個儘可能快,因爲它執行很多次。我想出了以下內容(不確定它是否是最好的方法,我是scala的新手)。

我想使用find()方法返回Option[Cause]。有沒有辦法將那些返回None(它不會在現實中發生,在列表中總是存在的原因,除非我有一個錯誤)發生,並且將它從Some monad中提取出來以便理解?我似乎無法在其中使用matches

val firstCauses : Set[Cause] = (for { 
      effect <- effects 
      possibleCause = allCauses.find(_.possibleEffects.contains(effect)) 
      //todo: filter out possibleCause if it is not Some(Cause), and get it out of the Some monad so that the yield takes it 
      } yield possibleCause).toSet 
+0

那豈不是更容易做到設置交叉點? –

+0

如何設置交叉點以實現我所需要的?只要我在'possibleEffects'中找到一個對'效果'有影響的'原因',我想停下來移動到下一個效果。我不想迭代到最後。除非我誤解了某些東西。實際上'possibleEffects intersects effects'總會返回至少一個元素,這就是爲什麼我說'None'永遠不會發生的原因 – jbx

回答

4

因爲你可以遍歷一個換理解選項,您可以更改「=」到「< - 」,這會給你同樣的結果壓扁

val firstCauses : Set[Cause] = (for { 
    effect <- effects 
    possibleCause <- allCauses.find(_.possibleEffects.contains(effect)) 
} yield possibleCause) 
+0

哦,這聽起來很乾淨!如果沒有的話,它會被過濾掉嗎? – jbx

+2

是的,這會過濾掉無,並保留一些 –

+0

的值我喜歡這個實現,你沒有中間收集那裏。這減少了計算。 – tiran

3

您不需要過濾返回None的那些。您可以使用flatten方法將Set[Option[T]]變成Set[T]。這將擺脫None的你:

> val s = Set(Some(1), None, Some(2), None,Some(3)) 
s: scala.collection.immutable.Set[Option[Int]] = Set(Some(1), None, Some(2), Some(3)) 
> s.flatten 
res1: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

所以,要清楚,你可以在yieldOption你換理解,只是flatten結果。