仅在达到 LazyList 中的累积和阈值时才评估位置

Only evaluate position when reaching cumulative sum threshold in LazyList

我想在 2 的惰性列表中找到达到固定阈值(例如 10)的位置,例如:

LazyList.
    continually(2).
    zipWithIndex.
    scanLeft((0,0)){case (acc, el) => (acc._1 + el._1, el._2)}.
    takeWhile(_._1 <= 10)

res72: LazyList[(Int, Int)] = LazyList(
  (0, 0),
  (2, 0),
  (4, 1),
  (6, 2),
  (8, 3),
  (10, 4)
)

是否可以在不收集所有中间结果的情况下以功能方式执行相同的操作,仅在达到累积和时才返回最终位置,foldLeft 例如或类似的?

是的,你可以使用collectFirst,另外我会把zipWithIndex移到scanLeft

之后
LazyList
  .continually(2)
  .scanLeft(0)((acc, x) => acc + x)
  .zipWithIndex
  .collectFirst {
    case (x, idx) if (x >= 10) => idx
  }

那 returns 一个 Option[Int] 因为 collect 可能永远不会匹配,但你知道在这种情况下它会匹配所以你可以 .get.getOrElse(new IllegalStateException("This should have never happened"))