Они очень тесно связаны.
Однако есть как минимум два варианта использования, когда вы должны использовать методы .doOn*
(вместо аргументов .subscribe
):
- Если вы хотите добавить побочные эффекты где-нибудь , а не и конец цепочки операторов (а не только в конце), ИЛИ
- Если вы не контролируете подписку
Более конкретно:
# 1 Размещение побочных эффектов в цепочке
Методы .doOn*
могут быть размещены в любом месте в цепочке операторов. С другой стороны, аргументы .subscribe
фактически всегда находятся на конце цепочки операторов.
Например, рассмотрим следующий надуманный пример:
Flux.range(0, 5)
.doOnNext(i -> System.out.println("A: " + i))
.filter(i -> i % 2 == 0)
.doOnNext(i -> System.out.println("B: " + i))
.subscribe(i -> System.out.println("C: " + i));
A
будет видеть значения 0-4
, но B
и C
будут видеть только 0
, 2
и 4
.
Обратите внимание, что B и C фактически одинаковы, поскольку оба работают с сигналами в конце цепочки операторов.
# 2 Когда вы не контролируете подписку
Есть много случаев, когда вы не звоните .subscribe
самостоятельно. Вместо этого вы просто возвращаете Mono
/ Flux
из вашего метода и позволяете подписаться чему-то более высокому в стеке. (Например: контроллеры WebFlux)
В этом случае, поскольку вы не вызываете .subscribe
, вам нужно использовать операторы побочных эффектов, а не аргументы для .subscribe
.