懒惰地在Scala中生成部分和

时间:2014-11-17 19:45:20

标签: scala

我想制作一个懒惰的部分和列表,当我找到一个"合适的"和。例如,我想做类似以下的事情:

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调用的迭代元素。

0 个答案:

没有答案