Я новичок в rx java и не могу понять, что приносит Completable.defer и почему его использовать - это хорошая практика.

Итак, в чем разница между:

public Completable someMethod1() {
    return Completable.defer(() -> someMethod2());
}

Против

public Completable someMethod1() {
    return someMethod2();
}

Я вижу, что в реализации метода есть некоторая обработка исключений, но это меня превосходит. Ценить это.

4
aurelius 5 Мар 2019 в 19:20

1 ответ

Лучший ответ

Defer гарантирует, что каждый подписчик может получить свою собственную исходную последовательность, независимую от других подписчиков. Позвольте мне проиллюстрировать это двумя примерами:

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

Во втором примере есть состояние для каждого подписчика, которое в противном случае было бы общим для всех подписчиков. Теперь, поскольку каждый подписчик создает свою собственную индивидуальную последовательность, оба элемента индексируются, как и следовало ожидать.

10
akarnokd 5 Мар 2019 в 18:02