我有一组项目,我们可以调用它们Effect
,我有一个Cause
列表,其中包含possibleEffects : Set[Effect]
我需要遍历效果列表,只返回我为每个Cause
找到的第一个Effect
。可能存在导致多个效果的重叠原因,这就是结果需要在集合中的原因。我需要尽可能快,因为它执行了很多次。我想出了以下内容(不确定它是否是最好的方式,我是scala的新手)。
我正在尝试使用返回find()
的{{1}}方法。有没有办法过滤掉那些返回Option[Cause]
的东西(它实际上不会发生,列表中总会有原因,除非我有一个bug),并从内部的一些monad中提取它为了理解?我似乎无法在其中使用None
。
matches
答案 0 :(得分:4)
因为您可以在for-comprehension中迭代Option,所以您可以将“=”更改为“< - ”,这将为您提供与flatten相同的结果
val firstCauses : Set[Cause] = (for {
effect <- effects
possibleCause <- allCauses.find(_.possibleEffects.contains(effect))
} yield possibleCause)
答案 1 :(得分:3)
您无需过滤返回None
的内容。您可以使用Set[Option[T]]
方法将Set[T]
变为flatten
。这将为您排除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)
所以,要明确的是,您可以{for} yield
Option
,只需flatten
结果。