Understanding Kotlin's yield function
我在Kotlin中看不到
上面链接中的示例未提及太多,但以下内容
1 2 3 4 5 6 7 8 9 10 11 | val sequence = sequence { val start = 0 // yielding a single value yield(start) // yielding an iterable yieldAll(1..5 step 2) // yielding an infinite sequence yieldAll(generateSequence(8) { it * 3 }) } println(sequence.take(7).toList()) // [0, 1, 3, 5, 8, 24, 72] |
但是上面的例子并没有指出产量的重要性。
- 这是一个暂停功能是什么意思?
- 在什么情况下会有利?
您可以将
1 2 3 4 5 6 | val sequence = sequence { val start = 0 yield(start) // first return yieldAll(1..5 step 2) // if called again, will start from here yieldAll(generateSequence(8) { it * 3 }) // if called more that six times, start from here } |
它创建状态机和内容,但是您可以将其转换为Java中的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Seq { private AtomicInteger count = new AtomicInteger(0); private int state = 0; public int nextValue() { if (count.get() == 0) { return state; } else if (count.get() >= 1 && count.get() <= 5) { state += 2; return state; } else { state *= 3; return state; } } } |
在Java类中,我们通过具有两个变量来维护显式状态:
请注意,
让我们考虑一个示例,在该示例中您可以生成序列的下一个元素,但是看不到实现Java迭代器的简便方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | fun fibonacci() = sequence { var a_0 = 1 var a_1 = 1 // this sequence is infinite while(true) { val a_n = a_0 + a_1 a_0 = a_1 a_1 = a_n //this is a suspend function call yield(a_0) } } |
该示例使用
假设我们执行以下操作
1 2 3 | fibonacci().take(10).forEach{ println(it) } |
Kotlin中的
https://github.com/Kotlin/kotlinx.coroutines