我可以通过在先前生成的值上重复应用函数来生成值列表,如下所示:
List.iterate(math.Pi, 3)(x => math.sin(2*x))
List[Double] = List(3.141592653589793, -2.4492935982947064E-16, -4.898587196589413E-16)
在这种情况下,当列表的长度为3时,迭代将停止。集合库中是否有一个函数允许我根据某些谓词停止迭代,例如“生成特定值时停止生成列表”,而不是列表的长度?如果他们已经内置了可以解决此问题的任何其他功能,我也愿意使用Streams。
答案 0 :(得分:5)
我不确定这样的事情是否可以直接用于列表,可能是因为你可以创建潜在的无限数量的值。这就是您需要提供len
参数的原因。
但是,您可以创建一个生成值后跟Stream
的{{1}}。如果您知道值的数量将保留在列表中,则可以添加takeWhile
来电。
.toList
答案 1 :(得分:0)
为什么你不想写反复函数,比如
def f(i: Int, acc: List[Double] = List()): List[Double] = {
val newVal = math.sin(2*i)
if (newVal < 0) {
newVal :: acc
} else {
f(i + 1, newVal :: acc)
}
}