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
Types
Properties
Inheritors
Extensions
Limiter 解构扩展,第1个属性,相当于 Limiter.offset。
Limiter 解构扩展,第2个属性,相当于 Limiter.limit。
Limiter 解构扩展,第3个属性,相当于 Limiter.batchSize。
参数提供 Limiter.batchSize, receiver为 FlowCollector, flow的结果通过 withLimiter 限流
参数提供 Limiter.batchSize, receiver为 SequenceScope, sequence的结果通过 withLimiter 限流