Kotlin协程:如何将数组通道与过滤器/地图一起使用?

时间:2018-11-13 14:03:57

标签: kotlin kotlinx.coroutines

我需要在各个通道处理器之间插入10000个元素的缓冲区。

produce()提供了一种配置缓冲区大小的方法:

produce(capacity = 10_000) {
}

但是mapfilter默认为集合频道:

fun <E, R> ReceiveChannel<E>.map(context: CoroutineContext = Unconfined, transform: suspend (E) -> R): ReceiveChannel<R> =
    produce(context) { // No capacity specified, defaults to 0
        consumeEach {
            send(transform(it))
        }
    }

是否可以配置它?目前,我正在使用缓冲区构造这些stdlib函数的自己的版本,这不是很好。

1 个答案:

答案 0 :(得分:1)

唯一的方法是为自己的地图实现提供capacity参数:

fun <E, R> ReceiveChannel<E>.map(context: CoroutineContext = Unconfined, capacity: Int = 0, transform: suspend (E) -> R): ReceiveChannel<R> =
    produce(context, capacity = capacity) {
        consumeEach {
            send(transform(it))
        }
    }

我已经创建了https://github.com/Kotlin/kotlinx.coroutines/issues/841,但是不会很快实现。引入冷数据流以使冷数据源和冷数据源之间的取消和作用域层次结构保持一致时,所有通道运算符都可能会被重新处理。