gpt4 book ai didi

Scala 的collectFirst 函数返回Option[U]

转载 作者:行者123 更新时间:2023-12-03 05:13:38 24 4
gpt4 key购买 nike

在我正在编写的库中,这种情况发生过很多次,而且我对迄今为止提出的解决方案并不是特别满意。

假设我有一个昂贵的函数 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com