我想制作一个懒惰的部分和列表,当我找到一个"合适的"和。例如,我想做类似以下的事情:
val str = Stream.continually {
val i = Random.nextInt
println("generated " + i)
List(i)
}
str
.take(5)
.scanLeft(List[Int]())(_ ++ _)
.find(l => !l.forall(_ > 0))
这会产生如下输出:
generated -354822103
generated 1841977627
z: Option[List[Int]] = Some(List(-354822103))
这很好,因为我在找到合适的列表之前避免生成整个列表列表。但是,它不是最理想的,因为我生成了一个我不需要的额外随机数(即此测试运行中的第二个正数)。我知道我可以手动编写一个解决方案来做我想要的,但是有没有办法使用核心scala集合库来实现这个结果而不需要编写我自己的递归?
上面的示例只是一个玩具,但真正的应用程序涉及每个"重试的重型网络流量。当我建立一张地图,直到地图完成"。
编辑:请注意,即使将take(1)
替换为find(...)
,也会导致生成随机数,即使返回值List()
不依赖于该数字。有谁知道为什么在这种情况下生成这个数字?在这种情况下,我认为scanLeft
不需要获取接收scanLeft
调用的迭代元素。