You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中yield/Sequence用法困惑,请求代码修正

修正你的Kotlin Sequence与yield使用代码

原代码存在的两个核心问题:

  1. mapIterable中this指向错误:在sequence { ... }的lambda内部,this默认绑定的是SequenceScope对象,而非调用mapIterable的原Sequence<Int>。直接使用this.forEach会尝试遍历SequenceScope,而非目标序列。
  2. 未将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:15:10