Limiter
一个限流器。
通俗一点的理解,限流器可以理解为一个用于需要进行 数量限制 或者说需要 分页 的地方,常见于一些返回值为 Flow, Sequence 或者 Stream 之类的地方。
对于限流的具体实现细节由对应功能的实现者自行决定(包括是否真的进行分页等)。
Flow 有提供 Flow.take 、Stream 有提供 Stream.limit 之类的函数,但是 Limiter 更多的是为功能提供一个初始量。 有些情况下提供额外的Limiter参数可以对结果的获取有所优化,而有些情况下,使用 Limiter 的效果与直接使用流的API (例如Flow.take) 并无区别。
有效数字
Limiter 中,约定其所有有效数字均应大于 0
。
默认实现
Limiter 提供两个默认实现:
ZERO 所有数值恒为
0
的伴生实现,可直接作为默认值使用。通过 limiter.of(...) (for java) 或者 limiter(...) (for kotlin) 得到一个默认的数据类实现。
其他实现
对于默认实现无法满足需求的情况,需要进行独立的实现,这一般由核心或者其他组件提供,并会整合在其他参数类型中, 例如存在一个 Query
类型,它也许就会为了支持可限流的情况而对 Limiter 进行实现。
扩展
Limiter提供了一些扩展函数来快速对 flow、sequence、java stream 进行操作, 以flow为例:
val limiter: Limiter = ...
val flow1 = Limiter.toFlow { batchSize ->
println("batchSize: $batchSize")
emit(1)
emit(2)
emit(3)
}
val flow2 = flow { ... }.withLimiter(limiter)
解构
Limiter 支持对 offset、limit、batchSize 进行解构:
val (offset, limit, batchSize) = limiter
Author
ForteScarlet
See also
Inheritors
Functions
Limiter 解构扩展,第1个属性,相当于 Limiter.offset。
Limiter 解构扩展,第2个属性,相当于 Limiter.limit。
Limiter 解构扩展,第3个属性,相当于 Limiter.batchSize。
参数提供 Limiter.batchSize, receiver为 FlowCollector, flow的结果通过 withLimiter 限流
参数提供 Limiter.batchSize, receiver为 SequenceScope, sequence的结果通过 withLimiter 限流