我对generateSequenceKotlin 中的感到困惑。我似乎阅读手册都错了:
这是函数签名(用于generateSequence种子):
fun <T : Any> generateSequence(
seed: T?,
nextFunction: (T) -> T?
): Sequence<T>
Run Code Online (Sandbox Code Playgroud)
所以Sequence应该是相同类型的种子,下一个值也应该是下一个迭代代......
但是男人的例子是:
fun fibonacci(): Sequence<Int> {
return generateSequence(Pair(0, 1), { Pair(it.second, it.first + it.second) }).map { it.first }
}
?
println(fibonacci().take(10).toList()) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Run Code Online (Sandbox Code Playgroud)
所以看起来SequenceisInt的类型是种子 is Pair<Int, Int>。
生成器函数映射Pair<Int, Int>TO Int。下一个值如何发送到生成器,下一个Pair<Int, Int>构造在哪里(生成器的输出是Int...)?
这个函数到底是怎么知道什么时候停止的?生成器永不返回null
所以看起来序列的类型是 Int 种子是 Pair。
给定的fibonacci()函数用于generateSequence()生成 的序列Pair,然后使用该map函数将该序列转换为 的序列Int。
val pairs = generateSequence(Pair(0, 1), { Pair(it.second, it.first + it.second) })
// (0,1), (1,1), (1,2), (2,3), (3,5), (5,8) ...
val ints = pairs.map { it.first }
// 0, 1, 1, 2, 3, 5
Run Code Online (Sandbox Code Playgroud)
如果它帮助您思考,您可以想象“整个”第一个序列是在任何对转换为整数之前生成的。
这个函数到底是怎么知道什么时候停止的?
它没有。但是该示例使用该take()函数将序列截断为前 10 项,然后打印该序列而不是打印无限序列。
顺序是lazy; 它仅在需要时生成值(通过调用给定的生成器函数)。所以当generateSequence()返回时,它还没有生成任何东西——只是创建了一个可以这样做的序列。类似地,当应用于序列时,map()调用不会立即映射任何值,只是返回一个修改后的序列,如果/当生成任何值时,它会这样做。只有在take()被调用时,序列才会生成(并映射)一些值;并且因为 take() 在 10 个项目后停止,所以它不会产生更多。
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |