作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我正在编写的库中,这种情况发生过很多次,而且我对迄今为止提出的解决方案并不是特别满意。
假设我有一个昂贵的函数 f,它接受 T 类型的项并返回 Option[U] 类型的值。现在,假设我有一个 T 类型的集合,并且我想检索 f 在 T 的元素上执行时返回的第一个非 None 值,如果已经找到该值,则无需评估 T 的所有元素的 f 。
我想出的唯一方法是将 F 包装到 Extractor 对象中,并将其与 scala 的collectFirst 方法一起使用。
例如:
object FMatch { def unapply(t : T) = f(t) }
collection.collectFirst{ case FMatch(result) => result }
这看起来有点不优雅,而且我不确定 f 是否对每个结果只计算一次还是两次(我还没有对此进行测试来找出答案)。看起来拥有一个采用 T => Option[U] 类型参数而不是 PartialFunction1[T] 的collectFirst 版本会很有用。
有没有一种更优雅的方法来做到这一点,而我却缺少?
最佳答案
在集合上使用 View ,使其变得惰性并将该函数的调用推迟到最后可能的时刻(例如,对于第一个匹配之后的元素根本不会调用它):
xs.view map {f(_)} collectFirst {case Some(x) => x}
或
xs.view map {f(_)} find {_.isDefined}
或者按照 Alexey 的回复,采用无点风格:
xs.view map {f} find {_.isDefined}
这有望为您提供几种更普遍地思考问题的替代方法:)
关于Scala 的collectFirst 函数返回Option[U],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7303856/
问题是确认我是否正确理解了Option的使用。 我注意到方法 collect 返回一个列表,而 collectFirst 返回一个选项。是因为 collect 可以返回多个值或无(没有一个由空列表表示
我是一名优秀的程序员,十分优秀!