我在编写的库中多次发生这种情况,到目前为止,我对自己提出的解决方案并不特别满意。
假设我有一个昂贵的函数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)