仅在达到 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"))
我想在 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"))