变换与变换延迟

transform vs transformDeferred

项目反应堆通量 transformtransformDeferred 有什么区别。

好的例子会有帮助。

https://projectreactor.io/docs/core/release/reference/index.html#advanced-mutualizing-operator-usage

大多数时候,Flux 是“惰性”的:您 声明了一个处理管道,但数据只有在您 订阅后才开始流动 去吧。您可以多次订阅。

这称为 cold Flux(每次您订阅冷源时,该源都会重新生成其数据以供新订阅者使用) .

所以我们可以区分:

  • 组装时间:我们在 Flux 实例上调用运算符的时刻,返回一个新的 Flux 实例
  • 订阅时间:订阅该实例的时刻。实际上,时刻(复数),因为可能有多个订阅可能相距很远。

transform 是一种将一组运算符应用于给定 Flux 的便捷方法。例如,您希望服务方法返回的所有 Flux 使用 .log("serviceName"),因此您将此特征外化为 static Function<Flux, Flux>:

loggingTrait = f -> f.log("serviceName");`

现在您可以通过 transform.

在服务的所有 Flux-returning 方法中应用此特征

它会立即应用,就在组装时。由于订阅者紧随其后,因此他们都“共享”该函数的相同结果。

现在假设您想要记录到例如。包括订阅时间,或更依赖于每个订阅者的另一条数据。

这就是 transformDeferred 的用武之地:它 Function 的应用推迟到订阅发生的那一刻。另外,它为每个订阅应用 Function

所以你可以这样做:

loggingTrait = f -> f.log(serviceName + "@" + System.currentTimeMillis());

每个订阅者的日志类别都不同。