Limiter

interface Limiter

一个限流器

通俗一点的理解,限流器可以理解为一个用于需要进行 数量限制 或者说需要 分页 的地方,常见于一些返回值为 Flow, Sequence 或者 Stream 之类的地方。

对于限流的具体实现细节由对应功能的实现者自行决定(包括是否真的进行分页等)。

Flow 有提供 Flow.takeStream 有提供 Stream.limit 之类的函数,但是 Limiter 更多的是为功能提供一个初始量。 有些情况下提供额外的Limiter参数可以对结果的获取有所优化,而有些情况下,使用 Limiter 的效果与直接使用流的API (例如Flow.take) 并无区别。

有效数字

Limiter 中,约定其所有有效数字均应大于 0

默认实现

Limiter 提供两个默认实现:

  • ZERO 所有数值恒为 0 的伴生实现,可直接作为默认值使用。

  • 通过 limiter.of(...) (for java) 或者 limiter(...) (for kotlin) 得到一个默认的数据类实现。

其他实现

对于默认实现无法满足需求的情况,需要进行独立的实现,这一般由核心或者其他组件提供,并会整合在其他参数类型中, 例如存在一个 Query 类型,它也许就会为了支持可限流的情况而对 Limiter 进行实现。

扩展

Limiter提供了一些扩展函数来快速对 flowsequencejava 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 支持对 offsetlimitbatchSize 进行解构:

val (offset, limit, batchSize) = limiter

Author

ForteScarlet

See also

Types

Link copied to clipboard
object ZERO : Limiter

Limiter 的默认值实现,offsetlimit 均恒等于 0

Properties

Link copied to clipboard
abstract val batchSize: Int

对于部分平台的实现中,很有可能是分批次查询来获取结果的。 当平台支持的时候,可以通过 batchSize 来指定一个批次大小来限制其内部每次对于API的请求数量。

Link copied to clipboard
abstract val limit: Int

限流数量,即本次所得数据量最大不应超过此限制。 例如 limit = 10, 那么返回值结果中的最终元素数量应当 <= 10.

Link copied to clipboard
abstract val offset: Int

偏移量,即从第 offset 条数据开始返回。 偏移量预期中的基数为 0, 即如果为 0 或者小于 0, 则代表从第一条数据开始获取。

Inheritors

Link copied to clipboard

Extensions

Link copied to clipboard
inline operator fun Limiter.component1(): Int

Limiter 解构扩展,第1个属性,相当于 Limiter.offset

Link copied to clipboard
inline operator fun Limiter.component2(): Int

Limiter 解构扩展,第2个属性,相当于 Limiter.limit

Link copied to clipboard
inline operator fun Limiter.component3(): Int

Limiter 解构扩展,第3个属性,相当于 Limiter.batchSize

Link copied to clipboard

得到当前 Limiter 中等价的分页属性:每页数量。计算方式大概类似于 pageNum = offset / pageSize.

Link copied to clipboard

得到当前 Limiter 中等价的分页属性:页码大小。相当于 Limiter.limit.

Link copied to clipboard
inline fun <T> Limiter.toFlow(crossinline collector: suspend FlowCollector<T>.(batchSize: Int) -> Unit): Flow<T>

参数提供 Limiter.batchSize, receiver为 FlowCollector, flow的结果通过 withLimiter 限流

Link copied to clipboard
inline fun <T> Limiter.toSequence(crossinline block: suspend SequenceScope<T>.(batchSize: Int) -> Unit): Sequence<T>

参数提供 Limiter.batchSize, receiver为 SequenceScope, sequence的结果通过 withLimiter 限流