我在编写的库中多次发生这种情况,到目前为止,我对自己提出的解决方案并不特别满意。

假设我有一个昂贵的函数f,该函数接受类型T的项并返回类型Option [U]的值。现在,假设我有一个类型T的集合,并且我想检索f跨T元素执行时返回的第一个non-None值,如果已经找到该值,则不对T的所有元素求f。

我想到的唯一方法是将F包装到一个Extractor对象中,并将其与scala的collectFirst方法一起使用。

例如:

object FMatch { def unapply(t : T) = f(t) }

collection.collectFirst{ case FMatch(result) => result }

这似乎有点不雅致,我不确定每个结果对f的评估是一次还是两次(我还没有进行测试以找出答案)。似乎有一个collectFirst版本使用参数T => Option [U]而不是PartialFunction1 [T]的版本似乎很有用。

有什么更理想的方式来实现我所缺少的吗?

最佳答案

用这个:

collection.toIterator.map(f).find(_.isDefined)

10-04 18:40