Kotlin中yield/Sequence用法困惑,请求代码修正
修正你的Kotlin Sequence与yield使用代码
原代码存在的两个核心问题:
mapIterable中this指向错误:在sequence { ... }的lambda内部,this默认绑定的是SequenceScope对象,而非调用mapIterable的原Sequence<Int>。直接使用this.forEach会尝试遍历SequenceScope,而非目标序列。- 未将
IntRange转为Sequence:1..exponent是IntRange(属于Iterable类型),而mapIterable是Sequence的扩展函数,必须先通过asSequence()将其转换为序列才能调用。
修正后的代码:
fun Sequence<Int>.mapIterable(transform: (Int) -> Int) = sequence { // 使用this@mapIterable明确引用外部的Sequence实例 this@mapIterable.forEach { x -> yield(transform(x)) } } fun Sequence<Int>.product(): Int { return this.reduce { acc, x -> acc * x } } infix fun Int.powerof(exponent: Int): Int { // 将IntRange转换为Sequence后再执行映射操作 return (1..exponent).asSequence() .mapIterable { this } // this指代当前调用powerof的Int实例 .product() } fun main() { println(2 powerof 10) // 输出:1024 }
关于yield与Sequence的关键说明:
sequence { ... }用于构建惰性序列:序列中的元素不会提前生成,只有当执行终端操作(比如reduce、forEach、toList等)时,才会逐步执行sequence块内的代码,并通过yield逐个发射元素。- 你实现的
mapIterable逻辑和标准库的Sequence.map一致,都是惰性地对每个元素执行转换,避免一次性生成所有元素占用内存。
内容的提问来源于stack exchange,提问作者ArekBulski
相关产品推荐
相关产品推荐

