
序列
|
117
个值的函数。它的签名如下所示:
fun <T : Any> generateSequence(
seed: T?,
nextFunction: (T) -> T?
): Sequence<T>
在这种情况下,seed 是紧随给定的整数之后的整数,函数简单地加一。按照正常的
Kotlin 习惯用法,lambda 表达式放在generateSequence 函数中括号后。序列中
的 fiest 函数返回满足提供的 lambda 表达式的第一个值,在本案例中,该变量是对
isPrime 扩展函数的引用。
在本案例中,nextPrime 函数生成了一个整数的无限序列,逐个验证它们并找到第一
个质数。first 函数返回一个值而不是一个序列,所以它是一个
末端
操作符。如果没有
末端操作符,这个序列中将不会有值被处理。在本案例中,将为 first 操作赋予一个
被称为 predicate(谓词)(因为它返回布尔值)的 lambda 表达式,并且该序列将继续
产生值,直到满足谓词为止。
参阅
6.3 节也讨论了无限序列。
6.3
管理无限序列
问题
如何获取无限序列的一部分?
解决方案
使用返回 null 的序列生成器,或者使用诸如 takeWhile 的序列函数。
讨论
序列与 Java 中的流类似,都拥有过渡操作或末端操作。过渡操作返回一个新的序列,末
端操作返回任意其他值。当你在序列上通过函数调用创建了一个流水线时,在进行末端
操作之前不会有数据通过序列。
示例 6-7 中展示的函数 firstNPrimes 计算从 ...