通过谓词限制迭代

时间:2015-06-17 12:38:45

标签: scala

我可以通过在先前生成的值上重复应用函数来生成值列表,如下所示:

List.iterate(math.Pi, 3)(x => math.sin(2*x))

List[Double] = List(3.141592653589793, -2.4492935982947064E-16, -4.898587196589413E-16)

在这种情况下,当列表的长度为3时,迭代将停止。集合库中是否有一个函数允许我根据某些谓词停止迭代,例如“生成特定值时停止生成列表”,而不是列表的长度?如果他们已经内置了可以解决此问题的任何其他功能,我也愿意使用Streams。

2 个答案:

答案 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)
    }
}