Sim*_*slé 6

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

这称为 Flux(并且每次订阅冷源时,源都会为新订阅者的利益重新生成其数据)。

所以我们可以区分:

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

transform是将一组运算符应用于给定Flux. 例如,您希望Flux服务的方法返回的所有内容都使用.log("serviceName"),因此您将这个特征具体化为static Function<Flux, Flux>

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

现在你可以通过transform.

它在组装时立即应用。由于订阅者随后而来,他们都“共享”了相同的函数结果。

现在想象一下你想要记录到例如。包括订阅时间,或其他更依赖于每个订阅者的数据。

这就是transformDeferred进来的地方:它将应用程序推迟Function到订阅发生的那一刻。另外,它适用Function于每个订阅。

所以你可以这样做:

loggingTrait = f -> f.log(serviceName + "@" + System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)

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