提问人:ArekBulski 提问时间:11/8/2023 更新时间:11/8/2023 访问量:42
Kotlin 产量示例
Kotlin yield example
问:
我正在学习 Kotlin,出于对它的热爱,我无法弄清楚产量/顺序。有人可以更正我的代码吗?
fun Sequence<Int>.mapIterable(transform: (Int)->Int) = sequence {
this.forEach({ x -> yield(transform(x)) })
}
fun Sequence<Int>.product(): Int {
return this.reduce({ acc,x -> acc*x })
}
infix fun Int.powerof(exponent: Int): Int {
return (1..exponent).mapIterable({ x -> this }).product()
}
fun main() {
println(2 powerof 10)
}
答:
0赞
ArekBulski
11/8/2023
#1
正如@Sweeper建议的:
fun Sequence<Int>.product(): Int {
return this.reduce({ acc,x -> acc*x })
}
infix fun Int.powerof(exponent: Int): Int {
return (1..exponent).asSequence().map({ this }).product()
}
fun main() {
println(2 powerof 10)
}
4赞
Sweeper
11/8/2023
#2
mapIterable
不编译,因为指的是 lambda 的接收器,这是一个 .这就是允许您调用 .你的意思是 的接收器,你可以把它写成 。this
sequence { ... }
SequenceScope<Int>
SequenceScope
yield
mapIterable
this@mapIterable
请注意,这只是在重新发明 Sequence.map
。只需改用即可。mapIterable
map
product
很好,但 using 意味着当序列为空时会引发异常。我会用以下命令来写这个:reduce
fold
fun Sequence<Int>.product() = fold(1, Int::times)
在 中,不是 ,而是 。您可以将其转换为 using asSequence
:powerOf
(1..exponent)
Sequence<Int>
IntRange
Sequence<Int>
(1..exponent).asSequence().map { x -> this }.product()
另一种方法是 generateSequence
生成 的无限序列,然后 。this
take(exponent)
infix fun Int.powerOf(exponent: Int) =
generateSequence { this }.take(exponent).product()
也就是说,在这里懒惰地做事并不比仅仅创建一个.使用此方法可以有意义地计算的最大指数是 31(2^31,并且您已经达到了 的最大值 )。数组中的 31 个整数并不多。IntArray(exponent) { this }
Int
评论
0赞
ArekBulski
11/8/2023
为了便于论证,我们假设指数是 10 亿。产品将没有意义,但这不是重点。然后,数组将占用大量内存。如果这些 int 被装箱,那就更糟了,对吧?编辑啊 IntArray 是一个原始数组,请忽略。
上一个:R 中的数据/矩阵操作 [重复]
下一个:如何强制刷新网站图标?
评论
mapIterable
map
mapIterable
map
Sequence.map
(1..exponent).asSequence().map(...)
map
List