LazyList.fill(n)在Scala中是如何工作的?



我想了解LazyList是如何。填充实际上是有效的。我使用LazyList.fill(n)实现了一个重试逻辑。但似乎没有像预期的那样工作。

def retry[T](n: Int)(block: => T): Try[T] = {
val lazyList = LazyList.fill(n)(Try(block))
lazyList find (_.isSuccess) getOrElse lazyList.head
}

考虑到上面的代码,我试图用重试逻辑执行块。如果执行成功,则返回block else重试的结果,直到重试成功为止。

是否像LazyList将计算第一个元素,如果它发现为真,它跳过对列表中其余元素的计算?

正如我在评论中已经提到的,这正是LazyList应该做的。

LazyList中的元素也只有在实际消费者有需求时才具体化/计算。

LazyListfind方法尊重这种懒惰性。你也可以在文档中找到清楚的说明- https://www.scala-lang.org/api/2.13.x/scala/collection/immutable/LazyList.html#find(p:A=%3EBoolean):Option[A]

def find(p: (A) => Boolean): Option[A]
// Finds the first element of the lazy list satisfying a predicate, if any.
// Note: may not terminate for infinite-sized collections.
// This method does not evaluate any elements further than the first element matching the predicate.

因此,如果第一个元素成功,它将在第一个元素本身处停止。

同样,如果你正在编写一个retry方法,那么你可能也想在第一次成功时停止。为什么在成功之后还要继续评估block呢?

为了得到一个更有帮助的答案,你可能需要更好地阐明你的确切需求。

最新更新