Я начал играть с RxJava и ReactFX, и я стал очень очарован этим. Но поскольку я экспериментирую, у меня есть десятки вопросов, и я постоянно исследую ответы.
Одна вещь, которую я наблюдаю (не предназначенная для каламбура), - это, конечно, ленивое исполнение. С моим поисковым кодом ниже я заметил, что ничего не выполняется, пока не будет вызван merge.subscribe(pet -> System.out.println(pet))
. Но меня поразило, когда я подписался на второго абонента merge.subscribe(pet -> System.out.println("Feed " + pet))
, он снова произвел "итерацию".
То, что я пытаюсь понять, - это поведение итерации. Кажется, он не выглядит как Java 8 stream
, который может использоваться только один раз. Это буквально проходит через каждый String
по одному и публикует его как значение для этого момента? И какие-либо новые подписчики, следующие за ранее уволенными подписчиками, получают эти предметы, как если бы они были новыми?
public class RxTest {
public static void main(String[] args) {
Observable<String> dogs = Observable.from(ImmutableList.of("Dasher", "Rex"))
.filter(dog -> dog.matches("D.*"));
Observable<String> cats = Observable.from(ImmutableList.of("Tabby", "Grumpy Cat", "Meowmers", "Peanut"));
Observable<String> ferrets = Observable.from(CompletableFuture.supplyAsync(() -> "Harvey"));
Observable<String> merge = dogs.mergeWith(cats).mergeWith(ferrets);
merge.subscribe(pet -> System.out.println(pet));
merge.subscribe(pet -> System.out.println("Feed " + pet));
}
}