例如,如果您有数百万个元素,但通常只需要检查前一百万个(例如,如果您正在累积一个总和并且您在某个最大值处饱和,或者您正在构建一些其他复杂的数据结构,但您在检查后完成前 M 个元素)。 FoldLeft 总是强制您遍历整个序列。理想情况下,您可以提供一个谓词,让 foldLeft 知道您已完成。
如果 scanLeft 被懒惰地评估(?),也许 scanLeft 与查找(查找第一个有效元素)一起可以完成此操作。我相信像这样的东西可以在 Haskell 中工作,但不确定 Scala。
numbers.scanLeft(0)((a, b) => a + b).find(_ >= 100)
所以如果 numbers = List(100,0,9,10),那么 scanLeft 只会查看第一个元素。
最佳答案
scanLeft
为已经惰性的集合生成惰性集合,例如 Iterator 或 LazyList ( Strem 之前的 2.13
)。因此,您可以使用它来提前中止。
例如:
LazyList.continually(100)
.scanLeft(0) { case (acc, n) => acc + n }
.takeWhile(_ < 1000)
.toList
// res: List[Int] = List(0, 100, 200, 300, 400, 500, 600, 700, 800, 900)
List(0, 100, 5, 300)
.iterator
.map(i => { println(i); i })
.scanLeft(0) { case (acc, n) => acc + n }
.find(_ >= 100)
// 0
// 100
// res: Option[Int] = Some(100)
关于scala - 当您并不总是需要检查列表的所有元素时,您如何提高 foldLeft(或 scanLeft)的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59867149/