Отсрочка гарантирует, что каждый подписчик может получить свою собственную исходную последовательность, независимую от других подписчиков. Позвольте мне проиллюстрировать это двумя примерами:
AtomicInteger index = new AtomicInteger();
Flowable<String> source =
Flowable.just("a", "b", "c", "d", "e", "f")
.map(v -> index.incrementAndGet() + "-" + v)
;
source.subscribe(System.out:println);
source.subscribe(System.out:println);
печать
1-a
2-b
3-c
4-d
5-e
6-f
7-a
8-b
9-c
10-d
11-e
12-f
против
Flowable<String> source =
Flowable.defer(() -> {
AtomicInteger index = new AtomicInteger();
return Flowable.just("a", "b", "c", "d", "e", "f")
.map(v -> index.incrementAndGet() + "-" + v)
;
})
;
source.subscribe(System.out:println);
source.subscribe(System.out:println);
печать
1-a
2-b
3-c
4-d
5-e
6-f
1-a
2-b
3-c
4-d
5-e
6-f
Во втором примере существует состояние для каждого подписчика, которое в противном случае было бы разделено между всеми подписчиками. Теперь, поскольку каждый подписчик получает свою собственную индивидуальную последовательность, оба элемента индекса, как и следовало ожидать.