
序列
|
119
的限制。如果小于,它将计算下一个质数。否则,它将返回 null 并终止序列。
当然,无法知道下一个质数是否会大于限制,因此此函数实际上会产生一个 list,其中
包括超出限制的第一个素数。然后,dropLast 函数在返回结果 list 之前将其截断。
大多数时候,有一种更简单的方法可以解决相同的问题。在这种情况下,可以在序列上
使用 takeWhile 函数而不是使生成函数返回 null,参见示例 6-9。
示例 6-9:小于给定值的质数(版本 2)
fun primesLessThan(max: Int): List<Int> =
generateSequence(2, ::nextPrime)
.takeWhile { it < max }
.toList()
只要提供的谓词返回 true,takeWhile 函数就会从序列中提取值。
这些方法都可以使用,使用哪种取决于个人喜好。
6.4
以固定间隔从序列生成元素
问题
如何从序列中以指定的间隔生成值。
解决方案
将 sequence 函数与 yield 挂起函数一起使用。
讨论
与序列相关的另一个函数是 squence,它拥有如示例 6-10 中所示的签名。
示例 6-10:sequence 函数的签名
fun <T> sequence(
block: suspend SequenceScope<T>.() -> Unit
): Sequence<T>
sequence 函数通过执行给定的代码块来生成序列。该代码块是一个没有参数的 lambda ...