Scala中LazyList.fill(n)工作原理及重试代码问题咨询
Scala中LazyList.fill的工作机制与重试逻辑分析
首先明确你的核心疑问:LazyList会在找到第一个成功元素后,跳过剩余元素的计算。因为LazyList是惰性求值的集合,它的元素不会提前全部生成,只有当你访问某个元素时,才会触发该元素的计算,并且计算后的结果会被缓存起来。
你的代码逻辑拆解
来看你写的重试函数:
def retry[T](n: Int)(block: => T): Try[T] = { val lazyList = LazyList.fill(n)(Try(block)) lazyList find (_.isSuccess) getOrElse lazyList.head }
LazyList.fill(n)(Try(block)):fill的第二个参数是传名参数(elem: => A),这意味着LazyList里的每个Try(block)都不会提前执行,只有当该元素被访问时,才会触发block的执行并包装成Try。lazyList find (_.isSuccess):这个方法会从LazyList的第一个元素开始,逐个触发元素的计算(也就是执行block),一旦找到第一个isSuccess为true的元素,就会立即停止遍历,后续的元素不会被计算——这完全符合你“最多重试n次,成功就停止”的需求。getOrElse lazyList.head:当所有n次尝试都失败时,find会返回None,此时lazyList.head是已经计算过的第一个元素(前面遍历所有元素时已经触发过它的计算,并且被缓存了),不会重复执行block。
可能的“未达预期”原因
如果你觉得逻辑没生效,可能是以下情况:
- 误传了
n=0:此时LazyList.fill(0)(...)是空列表,find返回None,lazyList.head会抛出NoSuchElementException。 block本身带有副作用且你误以为多次执行:比如block里的打印语句没输出预期次数——这其实是正确的,因为成功后就停止了,不会执行剩余次数。
内容的提问来源于stack exchange,提问作者Dipu Muraleedharan
相关产品推荐
相关产品推荐

