RxJava - Guia rápido

RxJava é uma extensão baseada em Java do ReactiveX. Ele fornece implementação ou projeto ReactiveX em Java. A seguir estão as principais características do RxJava.

  • Estende o padrão do observador.

  • Suporta sequências de dados / eventos.

  • Fornece operadores para compor sequências de forma declarativa.

  • Lida com threading, sincronização, thread-safety e estruturas de dados concorrentes internamente.

O que é ReactiveX?

ReactiveX é um projeto que visa fornecer conceito de programação reativa para várias linguagens de programação. A programação reativa se refere ao cenário em que o programa reage à medida que os dados aparecem. É um conceito de programação baseado em eventos e os eventos podem se propagar para observadores de registradores.

Conforme Reactive, eles combinaram o melhor do padrão Observer, do padrão Iterator e do padrão funcional.

O padrão Observer bem feito. ReactiveX é uma combinação das melhores ideias do padrão Observer, do padrão Iterator e da programação funcional.

Programação Funcional

A programação funcional gira em torno da construção do software usando funções puras. Uma função pura não depende do estado anterior e sempre retorna o mesmo resultado para os mesmos parâmetros passados. As funções puras ajudam a evitar problemas associados a objetos compartilhados, dados mutáveis ​​e efeitos colaterais geralmente predominantes em ambientes de multi-threading.

Programação reativa

A programação reativa se refere à programação orientada a eventos, em que os fluxos de dados chegam de forma assíncrona e são processados ​​quando chegam.

Programação Reativa Funcional

RxJava implementa ambos os conceitos juntos, onde os dados dos fluxos mudam ao longo do tempo e a função do consumidor reage de acordo.

O Manifesto Reativo

Manifesto reativo é um documento online que afirma o alto padrão dos sistemas de software de aplicação. De acordo com o manifesto, a seguir estão os principais atributos de um software reativo -

  • Responsive - Deve sempre responder em tempo hábil.

  • Message Driven - Deve usar a passagem de mensagens assíncrona entre os componentes para que eles mantenham um acoplamento fraco.

  • Elastic - Deve permanecer ágil mesmo sob carga elevada.

  • Resilient - Deve permanecer responsivo mesmo se algum componente falhar.

Principais componentes do RxJava

RxJava tem dois componentes principais: Observables e Observer.

  • Observable - Representa um objeto semelhante ao Stream que pode emitir zero ou mais dados, pode enviar mensagem de erro, cuja velocidade pode ser controlada durante a emissão de um conjunto de dados, pode enviar dados finitos como infinitos.

  • Observer- Assina os dados de sequência do Observable e reage por item dos observáveis. Os observadores são notificados sempre que Observable emite dados. Um Observer trata os dados um por um.

Um observador nunca é notificado se os itens não estiverem presentes ou um retorno de chamada não for retornado para um item anterior.

Configuração de ambiente local

RxJava é uma biblioteca para Java, então o primeiro requisito é ter o JDK instalado em sua máquina.

Requisitos do sistema

JDK 1,5 ou superior.
Memória Sem requisitos mínimos.
Espaço em disco Sem requisitos mínimos.
Sistema operacional Sem requisitos mínimos.

Etapa 1 - Verifique a instalação do Java em sua máquina

Em primeiro lugar, abra o console e execute um comando java baseado no sistema operacional em que está trabalhando.

SO Tarefa Comando
janelas Abrir console de comando c: \> versão java
Linux Abra o terminal de comando $ java -version
Mac Terminal aberto máquina: <joseph $ java -version

Vamos verificar a saída de todos os sistemas operacionais -

SO Resultado
janelas

versão java "1.8.0_101"

Java (TM) SE Runtime Environment (build 1.8.0_101)

Linux

versão java "1.8.0_101"

Java (TM) SE Runtime Environment (build 1.8.0_101)

Mac

versão java "1.8.0_101"

Java (TM) SE Runtime Environment (build 1.8.0_101)

Se você não tiver o Java instalado em seu sistema, baixe o Java Software Development Kit (SDK) do seguinte link https://www.oracle.com. Estamos assumindo o Java 1.8.0_101 como a versão instalada para este tutorial.

Etapa 2 - Definir ambiente JAVA

Colocou o JAVA_HOMEvariável de ambiente para apontar para o local do diretório base onde o Java está instalado em sua máquina. Por exemplo.

SO Resultado
janelas Defina a variável de ambiente JAVA_HOME para C: \ Program Files \ Java \ jdk1.8.0_101
Linux export JAVA_HOME = / usr / local / java-current
Mac export JAVA_HOME = / Library / Java / Home

Anexe a localização do compilador Java ao caminho do sistema.

SO Resultado
janelas Anexar a string C:\Program Files\Java\jdk1.8.0_101\bin no final da variável do sistema, Path.
Linux exportar PATH = $ PATH: $ JAVA_HOME / bin /
Mac não requerido

Verifique a instalação do Java usando o comando java -version como explicado acima.

Etapa 3 - Baixe o arquivo RxJava2

Baixe a versão mais recente do arquivo jar RxJava de RxJava @ MVNRepository e sua dependência Reactive Streams @ MVNRepository . No momento de escrever este tutorial, baixamos rxjava-2.2.4.jar, reactive-streams-1.0.2.jar e os copiamos para a pasta C: \> RxJava.

SO Nome do arquivo
janelas rxjava-2.2.4.jar, reativo-streams-1.0.2.jar
Linux rxjava-2.2.4.jar, reativo-streams-1.0.2.jar
Mac rxjava-2.2.4.jar, reativo-streams-1.0.2.jar

Etapa 4 - Definir o ambiente RxJava

Colocou o RX_JAVAvariável de ambiente para apontar para o local do diretório base onde o jar RxJava está armazenado em sua máquina. Vamos supor que armazenamos rxjava-2.2.4.jar e reactive-streams-1.0.2.jar na pasta RxJava.

Sr. Não SO e descrição
1

Windows

Defina a variável de ambiente RX_JAVA para C: \ RxJava

2

Linux

exportar RX_JAVA = / usr / local / RxJava

3

Mac

exportar RX_JAVA = / Library / RxJava

Etapa 5 - Definir Variável CLASSPATH

Colocou o CLASSPATH variável de ambiente para apontar para o local do jar RxJava.

Sr. Não SO e descrição
1

Windows

Defina a variável de ambiente CLASSPATH como% CLASSPATH%;% RX_JAVA% \ rxjava-2.2.4.jar;% RX_JAVA% \ reactive-streams-1.0.2.jar;.;

2

Linux

export CLASSPATH = $ CLASSPATH: $ RX_JAVA / rxjava-2.2.4.jar: reactive-streams-1.0.2.jar :.

3

Mac

export CLASSPATH = $ CLASSPATH: $ RX_JAVA / rxjava-2.2.4.jar: reactive-streams-1.0.2.jar :.

Etapa 6 - Teste a configuração do RxJava

Crie uma classe TestRx.java conforme mostrado abaixo -

import io.reactivex.Flowable;
public class TestRx {
   public static void main(String[] args) {
      Flowable.just("Hello World!")
         .subscribe(System.out::println);
   }
}

Etapa 7 - Verifique o resultado

Compile as classes usando javac compilador da seguinte forma -

C:\RxJava>javac Tester.java

Verifique a saída.

Hello World!

Observables representa as fontes de dados onde Observers (Subscribers)escute-os. Resumindo, um Observável emite itens e um Assinante então consome esses itens.

Observável

  • Observável fornece dados assim que o assinante começa a ouvir.

  • Observável pode emitir qualquer número de itens.

  • Observável pode emitir apenas um sinal de conclusão e nenhum item.

  • Observável pode terminar com sucesso.

  • Observável pode nunca terminar. por exemplo, um botão pode ser clicado qualquer número de vezes.

  • Observável pode gerar erro a qualquer momento.

Assinante

  • Observável pode ter vários assinantes.

  • Quando um Observable emite um item, cada método onNext () do assinante é chamado.

  • Quando um Observable termina de emitir itens, cada método onComplete () do assinante é chamado.

  • Se um Observable emitir um erro, cada método onError () do assinante será chamado.

A seguir estão as classes básicas para criar observáveis.

  • Flowable- 0..N flui, emite 0 ou n itens. Suporta fluxos reativos e contrapressão.

  • Observable - 0..N flui, mas sem contrapressão.

  • Single- 1 item ou erro. Pode ser tratado como uma versão reativa da chamada de método.

  • Completable- Nenhum item emitido. Usado como um sinal de conclusão ou erro. Pode ser tratado como uma versão reativa do Runnable.

  • MayBe- Nenhum item ou 1 item emitido. Pode ser tratada como uma versão reativa de Opcional.

A seguir estão os métodos convenientes para criar observáveis ​​na classe Observable.

  • just(T item) - Retorna um Observable que sinaliza o item fornecido (referência constante) e então é concluído.

  • fromIterable(Iterable source) - Converte uma sequência Iterable em um ObservableSource que emite os itens na sequência.

  • fromArray(T... items) - Converte um Array em um ObservableSource que emite os itens do Array.

  • fromCallable(Callable supplier) - Retorna um Observable que, quando um observador se inscreve nele, invoca uma função que você especifica e emite o valor retornado dessa função.

  • fromFuture(Future future) - Converte um futuro em uma fonte observável.

  • interval(long initialDelay, long period, TimeUnit unit) - Retorna um Observable que emite um 0L após o initialDelay e números sempre crescentes após cada período de tempo posterior.

A classe Single representa a resposta de valor único. Observável único pode emitir apenas um único valor bem-sucedido ou um erro. Ele não emite o evento onComplete.

Declaração de Classe

A seguir está a declaração para io.reactivex.Single<T> classe -

public abstract class Single<T>
   extends Object
      implements SingleSource<T>

Protocolo

A seguir está o protocolo sequencial que opera o único observável -

onSubscribe (onSuccess | onError)?

Exemplo Único

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import java.util.concurrent.TimeUnit;

import io.reactivex.Single;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableSingleObserver;
import io.reactivex.schedulers.Schedulers;

public class ObservableTester  {
   public static void main(String[] args)  throws InterruptedException {
      //Create the observable
      Single<String> testSingle = Single.just("Hello World");

      //Create an observer
      Disposable disposable = testSingle
         .delay(2, TimeUnit.SECONDS, Schedulers.io())
         .subscribeWith(
         new DisposableSingleObserver<String>() {

         @Override
         public void onError(Throwable e) { 
            e.printStackTrace();
         }

         @Override
         public void onSuccess(String value) {
            System.out.println(value);
         }
      }); 
      Thread.sleep(3000);
      //start observing
      disposable.dispose();
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Hello World

A classe MayBe representa uma resposta adiada. MayBe observable pode emitir um único valor de sucesso ou nenhum valor.

Declaração de Classe

A seguir está a declaração para io.reactivex.Single<T> classe -

public abstract class Maybe<T>
   extends Object
      implements MaybeSource<T>

Protocolo

A seguir está o protocolo sequencial que MayBe Observable opera -

onSubscribe (onSuccess | onError | OnComplete)?

MayBe Example

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import java.util.concurrent.TimeUnit;

import io.reactivex.Maybe;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableMaybeObserver;
import io.reactivex.schedulers.Schedulers;

public class ObservableTester {
   public static void main(String[] args) throws InterruptedException {
      //Create an observer
      Disposable disposable = Maybe.just("Hello World")
         .delay(2, TimeUnit.SECONDS, Schedulers.io())
         .subscribeWith(new DisposableMaybeObserver<String>() {
         @Override
         public void onError(Throwable e) { 
            e.printStackTrace();
         }

         @Override
         public void onSuccess(String value) {
            System.out.println(value);
         }

         @Override
         public void onComplete() {
            System.out.println("Done!");
         }
      }); 
      Thread.sleep(3000);
      //start observing
      disposable.dispose();
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Hello World

A classe Completable representa uma resposta adiada. O observável completável pode indicar uma conclusão bem-sucedida ou um erro.

Declaração de Classe

A seguir está a declaração para io.reactivex.Completable classe -

public abstract class Completable
extends Object
implements CompletableSource

Protocolo

A seguir está o protocolo sequencial que o Completable Observable opera -

onSubscribe (onError | onComplete)?

Exemplo Completável

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import java.util.concurrent.TimeUnit;

import io.reactivex.Completable;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableCompletableObserver;
import io.reactivex.schedulers.Schedulers;

public class ObservableTester {
   public static void main(String[] args) throws InterruptedException {

      //Create an observer
      Disposable disposable = Completable.complete()
         .delay(2, TimeUnit.SECONDS, Schedulers.io())
         .subscribeWith(new DisposableCompletableObserver() {
         @Override
         public void onError(Throwable e) { 
            e.printStackTrace();
         }
         @Override
         public void onStart() {
            System.out.println("Started!");
         }
         @Override
         public void onComplete() {
            System.out.println("Done!");
         }
      }); 
      Thread.sleep(3000);
      //start observing
      disposable.dispose();
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Started!
Done!

A classe CompositeDisposable representa um contêiner que pode conter vários descartáveis ​​e oferece complexidade O (1) de adição e remoção de descartáveis.

Declaração de Classe

A seguir está a declaração para io.reactivex.disposables.CompositeDisposable classe -

public final class CompositeDisposable
extends Object
implements Disposable, io.reactivex.internal.disposables.DisposableContainer

Exemplo de CompositeDisposable

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Maybe;
import io.reactivex.Single;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableMaybeObserver;
import io.reactivex.observers.DisposableSingleObserver;
import io.reactivex.schedulers.Schedulers;

import java.util.concurrent.TimeUnit;

public class ObservableTester  {
   public static void main(String[] args)  throws InterruptedException {    
      CompositeDisposable compositeDisposable = new CompositeDisposable();

      //Create an Single observer 
      Disposable disposableSingle = Single.just("Hello World")
      .delay(2, TimeUnit.SECONDS, Schedulers.io())
      .subscribeWith(
      new DisposableSingleObserver<String>() {
         @Override
         public void onError(Throwable e) {
            e.printStackTrace();
         }

         @Override
         public void onSuccess(String value) {
            System.out.println(value);
         }
      }); 

      //Create an observer
      Disposable disposableMayBe = Maybe.just("Hi")
      .delay(2, TimeUnit.SECONDS, Schedulers.io())
      .subscribeWith(new DisposableMaybeObserver<String>() {
         @Override
         public void onError(Throwable e) { 
            e.printStackTrace();
         }

         @Override
         public void onSuccess(String value) {
            System.out.println(value);
         }

         @Override
         public void onComplete() {
            System.out.println("Done!");
         }
      }); 

      Thread.sleep(3000);

      compositeDisposable.add(disposableSingle);
      compositeDisposable.add(disposableMayBe);

      //start observing
      compositeDisposable.dispose();
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Hello World
Hi

A seguir estão os operadores que são usados ​​para criar um Observable.

Sr. Não. Operador e descrição
1

Create

Cria um Observable do zero e permite que o método do observador chame programaticamente.

2

Defer

Não crie um Observable até que um observador se inscreva. Cria um novo observável para cada observador.

3

Empty/Never/Throw

Cria um observável com comportamento limitado.

4

From

Converte uma estrutura de objeto / dados em um Observable.

5

Interval

Cria um número inteiro de emissão observável em sequência com um intervalo de intervalo de tempo especificado.

6

Just

Converte uma estrutura de objeto / dados em um Observable para emitir o mesmo ou o mesmo tipo de objetos.

7

Range

Cria um número inteiro de emissão observável na sequência de um determinado intervalo.

8

Repeat

Cria um observável emitindo inteiros em sequência repetidamente.

9

Start

Cria um Observable para emitir o valor de retorno de uma função.

10

Timer

Cria um Observable para emitir um único item após um determinado atraso.

Criando exemplo de operador

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
//Using fromArray operator to create an Observable
public class ObservableTester  {
   public static void main(String[] args) { 
      String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
      final StringBuilder result = new StringBuilder();
      Observable<String> observable = Observable.fromArray(letters);
      observable
         .map(String::toUpperCase)
         .subscribe( letter -> result.append(letter));
      System.out.println(result);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

ABCDEFG

A seguir estão os operadores que são usados ​​para transformar um item emitido de um Observable.

Sr. Não. Operador e descrição
1

Buffer

Reúne itens do Observável em pacotes periodicamente e, em seguida, emite os pacotes em vez de itens.

2

FlatMap

Usado em observáveis ​​aninhados. Transforma itens em observáveis. Em seguida, achatar os itens em um único Observável.

3

GroupBy

Divida um Observável em um conjunto de Observáveis ​​organizado por chave para emitir diferentes grupos de itens.

4

Map

Aplique uma função a cada item emitido para transformá-lo.

5

Scan

Aplique uma função a cada item emitido, sequencialmente e, a seguir, emita o valor sucessivo.

6

Window

Reúne itens de janelas Observáveis ​​em janelas Observáveis ​​periodicamente e, a seguir, emite as janelas em vez de itens.

Exemplo de operador de transformação

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
//Using map operator to transform an Observable
public class ObservableTester  { 
   public static void main(String[] args) {    
      String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
      final StringBuilder result = new StringBuilder();
      Observable<String> observable = Observable.fromArray(letters);
      observable
         .map(String::toUpperCase)
         .subscribe( letter -> result.append(letter));
      System.out.println(result);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

ABCDEFG

A seguir estão os operadores que são usados ​​para emitir seletivamente item (ns) de um Observável.

Sr. Não. Operador e descrição
1

Debounce

Emite itens apenas quando o tempo limite ocorre sem emitir outro item.

2

Distinct

Emite apenas itens exclusivos.

3

ElementAt

emite apenas o item no índice n emitido por um Observable.

4

Filter

Emite apenas os itens que passam pela função de predicado fornecida.

5

First

Emite o primeiro item ou primeiro item que passou nos critérios fornecidos.

6

IgnoreElements

Não emite nenhum item do Observável, mas marca a conclusão.

7

Last

Emite o último elemento do Observable.

8

Sample

Emite o item mais recente com determinado intervalo de tempo.

9

Skip

Ignora os primeiros n itens de um Observável.

10

SkipLast

Pula os últimos n itens de um Observável.

11

Take

pega os primeiros n itens de um Observable.

12

TakeLast

pega os últimos n itens de um Observable.

Exemplo de operador de filtragem

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
//Using take operator to filter an Observable
public class ObservableTester  {
   public static void main(String[] args) {    
      String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
      final StringBuilder result = new StringBuilder();
      Observable<String> observable = Observable.fromArray(letters);
      observable
         .take(2)
         .subscribe( letter -> result.append(letter));
      System.out.println(result);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

ab

A seguir estão os operadores que são usados ​​para criar um único observável a partir de vários observáveis.

Sr. Não. Operador e descrição
1 And/Then/When

Combine conjuntos de itens usando intermediários de padrão e plano.

2 CombineLatest

Combine o último item emitido por cada Observable por meio de uma função especificada e emita o item resultante.

3 Join

Combine itens emitidos por dois Observáveis ​​se emitidos durante o período do segundo item Observável emitido.

4 Merge

Combina os itens emitidos de Observáveis.

5 StartWith

Emita uma sequência especificada de itens antes de começar a emitir os itens da fonte Observável

6 Switch

Emite os itens mais recentes emitidos por Observables.

7 Zip

Combina itens de Observáveis ​​com base na função e emite os itens resultantes.

Exemplo de operador de combinação

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
//Using combineLatest operator to combine Observables
public class ObservableTester {
   public static void main(String[] args) {    
      Integer[] numbers = { 1, 2, 3, 4, 5, 6};
      String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
      final StringBuilder result = new StringBuilder();
      Observable<String> observable1 = Observable.fromArray(letters);
      Observable<Integer> observable2 = Observable.fromArray(numbers);
      Observable.combineLatest(observable1, observable2, (a,b) -> a + b)
         .subscribe( letter -> result.append(letter));
      System.out.println(result);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

g1g2g3g4g5g6

A seguir estão os operadores que geralmente são úteis com Observáveis.

Sr. Não. Operador e descrição
1

Delay

Registre a ação para lidar com eventos de ciclo de vida observáveis.

2

Materialize/Dematerialize

Representa o item emitido e a notificação enviada.

3

ObserveOn

Especifique o planejador a ser observado.

4

Serialize

Força Observable a fazer chamadas serializadas.

5

Subscribe

Operar sobre as emissões de itens e notificações como concluídas de um Observável

6

SubscribeOn

Especifique o planejador a ser usado por um Observable quando ele for inscrito.

7

TimeInterval

Converta um Observável para emitir indicações da quantidade de tempo decorrido entre as emissões.

8

Timeout

Emite notificação de erro se o tempo especificado ocorrer sem a emissão de nenhum item.

9

Timestamp

Anexe o carimbo de data / hora a cada item emitido.

9

Using

Cria um recurso descartável ou mesmo tempo de vida do Observable.

Exemplo de operador de serviço público

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
//Using subscribe operator to subscribe to an Observable
public class ObservableTester  {
   public static void main(String[] args) {    
      String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
      final StringBuilder result = new StringBuilder();
      Observable<String> observable = Observable.fromArray(letters);
      observable.subscribe( letter -> result.append(letter));
      System.out.println(result);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

abcdefg

A seguir estão os operadores que avaliam um ou vários Observáveis ​​ou itens emitidos.

Sr. Não. Operador e descrição
1

All

Avalia todos os itens emitidos para atender a determinados critérios.

2

Amb

Emite todos os itens do primeiro Observable apenas dados vários Observables.

3

Contains

Verifica se um Observable emite um item específico ou não.

4

DefaultIfEmpty

Emite o item padrão se Observable não emitir nada.

5

SequenceEqual

Verifica se dois Observáveis ​​emitem a mesma sequência de itens.

6

SkipUntil

Descarta os itens emitidos pelo primeiro Observável até que um segundo Observável emita um item.

7

SkipWhile

Descarte itens emitidos por um Observável até que uma determinada condição se torne falsa.

8

TakeUntil

Descarta os itens emitidos por um Observable depois que um segundo Observable emite um item ou termina.

9

TakeWhile

Descarte os itens emitidos por um Observável após uma condição especificada se tornar falsa.

Exemplo de operador condicional

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
//Using defaultIfEmpty operator to operate on an Observable
public class ObservableTester  {
   public static void main(String[] args) {    
      final StringBuilder result = new StringBuilder();
      Observable.empty()
      .defaultIfEmpty("No Data")
      .subscribe(s -> result.append(s));
      System.out.println(result);
      String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
      final StringBuilder result1 = new StringBuilder();
      Observable.fromArray(letters)
      .firstElement()
      .defaultIfEmpty("No data")   
      .subscribe(s -> result1.append(s));
      System.out.println(result1);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

No Data
a

A seguir estão os operadores que operam em itens inteiros emitidos por um Observable.

Sr. Não. Operador e descrição
1

Average

Avalia as médias de todos os itens e emite o resultado.

2

Concat

Emite todos os itens de vários Observáveis ​​sem intercalação.

3

Count

Conta todos os itens e emite o resultado.

4

Max

Avalia o item com valor máximo de todos os itens e emite o resultado.

5

Min

Avalia o item de valor mínimo de todos os itens e emite o resultado.

6

Reduce

Aplique uma função em cada item e retorne o resultado.

7

Sum

Avalia soma de todos os itens e emite o resultado.

Exemplo de operador matemático

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
//Using concat operator to operate on multiple Observables
public class ObservableTester  {
   public static void main(String[] args)  throws InterruptedException {    
      Integer[] numbers = { 1, 2, 3, 4, 5, 6};
      String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
      final StringBuilder result = new StringBuilder();
      Observable<String> observable1 = Observable.fromArray(letters);
      Observable<Integer> observable2 = Observable.fromArray(numbers);
      Observable.concat(observable1, observable2)
         .subscribe( letter -> result.append(letter));
      System.out.println(result);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

abcdefg123456

A seguir estão as operadoras que têm controle mais preciso sobre a assinatura.

Sr. Não. Operador e descrição
1

Connect

Instrua um Observable conectável a emitir itens para seus assinantes.

2

Publish

Converte um Observável em um Observável conectável.

3

RefCount

Converte um Observável conectável em um Observável comum.

4

Replay

Garanta que a mesma sequência de itens emitidos seja vista por cada assinante, mesmo depois que o Observable começar a emitir itens e os assinantes se inscreverem posteriormente.

Exemplo de operador conectável

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
import io.reactivex.observables.ConnectableObservable;
//Using connect operator on a ConnectableObservable
public class ObservableTester {
   public static void main(String[] args) {
      String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
      final StringBuilder result = new StringBuilder();
      ConnectableObservable<String> connectable = Observable.fromArray(letters).publish();      
      connectable.subscribe(letter -> result.append(letter));
      System.out.println(result.length());
      connectable.connect();
      System.out.println(result.length());
      System.out.println(result);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

0
7
abcdefg

Conforme Reactive, um Assunto pode atuar como Observável e Observador.

Um Assunto é uma espécie de ponte ou proxy que está disponível em algumas implementações do ReactiveX que atua tanto como um observador quanto como um Observável. Por ser um observador, pode inscrever-se em um ou mais Observáveis ​​e, por ser um Observável, pode passar pelos itens que observa reemitindo-os e também pode emitir novos itens.

Existem quatro tipos de assuntos -

Sr. Não. Assunto e descrição
1

Publish Subject

Emite apenas os itens que são emitidos após o tempo de assinatura.

2 Replay Subject

Emite todos os itens emitidos pela fonte Observable, independentemente de quando ela assinou o Observable.

3

Behavior Subject

Após a assinatura, emite o item mais recente e, em seguida, continua a emitir o item emitido pela fonte Observável.

4

Async Subject

Emite o último item emitido pela fonte Observável após completar a emissão.

PublishSubject emite itens para Observadores atualmente inscritos e eventos de terminal para Observadores atuais ou atrasados.

Declaração de Classe

A seguir está a declaração para io.reactivex.subjects.PublishSubject<T> classe -

public final class PublishSubject<T>
extends Subject<T>

Exemplo de PublishSubject

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.subjects.PublishSubject;
public class ObservableTester  {
   public static void main(String[] args) {   
      final StringBuilder result1 = new StringBuilder();
      final StringBuilder result2 = new StringBuilder();         

      PublishSubject<String> subject = PublishSubject.create(); 
      subject.subscribe(value -> result1.append(value) ); 
      subject.onNext("a"); 
      subject.onNext("b"); 
      subject.onNext("c"); 
      subject.subscribe(value -> result2.append(value)); 
      subject.onNext("d"); 
      subject.onComplete();

      //Output will be abcd 
      System.out.println(result1);
      //Output will be d only
      //as subscribed after c item emitted.
      System.out.println(result2);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

abcd
d

BehaviorSubject emite o item mais recente que observou e, em seguida, todos os itens subsequentes observados para cada Observador inscrito.

Declaração de Classe

A seguir está a declaração para io.reactivex.subjects.BehaviorSubject<T> classe -

public final class BehaviorSubject<T>
extends Subject<T>

BehaviorSubject Example

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.subjects.BehaviorSubject;
public class ObservableTester  {
   public static void main(String[] args) {   
      final StringBuilder result1 = new StringBuilder();
      final StringBuilder result2 = new StringBuilder();         
      BehaviorSubject<String> subject =  BehaviorSubject.create(); 
      subject.subscribe(value -> result1.append(value) ); 
      subject.onNext("a"); 
      subject.onNext("b"); 
      subject.onNext("c"); 
      subject.subscribe(value -> result2.append(value)); 
      subject.onNext("d"); 
      subject.onComplete();
      //Output will be abcd
      System.out.println(result1);
      //Output will be cd being BehaviorSubject 
      //(c is last item emitted before subscribe)
      System.out.println(result2);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

abcd
cd

ReplaySubject reproduz eventos / itens para Observadores atuais e atrasados.

Declaração de Classe

A seguir está a declaração para io.reactivex.subjects.ReplaySubject<T> classe -

public final class ReplaySubject<T>
extends Subject<T>

Exemplo de ReplaySubject

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.subjects.ReplaySubject;
public class ObservableTester  {
   public static void main(String[] args) {   
      final StringBuilder result1 = new StringBuilder();
      final StringBuilder result2 = new StringBuilder();         

      ReplaySubject<String> subject = ReplaySubject.create(); 
      subject.subscribe(value -> result1.append(value) ); 
      subject.onNext("a"); 
      subject.onNext("b"); 
      subject.onNext("c"); 
      subject.subscribe(value -> result2.append(value)); 
      subject.onNext("d"); 
      subject.onComplete();

      //Output will be abcd
      System.out.println(result1);
      //Output will be abcd being ReplaySubject
      //as ReplaySubject emits all the items
      System.out.println(result2);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

abcd
abcd

AsyncSubject emite o único último valor seguido por um evento de conclusão ou o erro recebido para observadores.

Declaração de Classe

A seguir está a declaração para io.reactivex.subjects.AsyncSubject<T> classe -

public final class  AsyncSubject<T>
extends Subject<T>

Exemplo de AsyncSubject

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.subjects. AsyncSubject;
public class ObservableTester  {
   public static void main(String[] args) {   
      final StringBuilder result1 = new StringBuilder();
      final StringBuilder result2 = new StringBuilder();         

      AsyncSubject<String> subject =  AsyncSubject.create(); 
      subject.subscribe(value -> result1.append(value) ); 
      subject.onNext("a"); 
      subject.onNext("b"); 
      subject.onNext("c"); 
      subject.subscribe(value -> result2.append(value)); 
      subject.onNext("d"); 
      subject.onComplete();

      //Output will be d being the last item emitted
      System.out.println(result1);
      //Output will be d being the last item emitted     
      System.out.println(result2);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

d
d

Schedulers são usados ​​em ambiente multi-threading para trabalhar com operadores Observable.

Conforme Reactive, Scheduler são usados ​​para agendar como a cadeia de operadores se aplicará a diferentes threads.

Por padrão, um Observable e a cadeia de operadores que você aplica a ele farão seu trabalho e notificarão seus observadores no mesmo thread em que seu método Subscribe é chamado. O operador SubscribeOn altera esse comportamento especificando um Scheduler diferente no qual o Observable deve operar. O operador ObserveOn especifica um Scheduler diferente que o Observable usará para enviar notificações a seus observadores.

Existem seguintes tipos de Schedulers disponíveis no RxJava -

Sr. Não. Programador e descrição
1

Schedulers.computation()

Cria e retorna um Scheduler destinado ao trabalho computacional. A contagem de threads a serem agendados depende das CPUs presentes no sistema. Um thread é permitido por CPU. Melhor para loops de eventos ou operações de retorno de chamada.

2

Schedulers.io()

Cria e retorna um Scheduler destinado ao trabalho vinculado ao IO. O pool de threads pode ser estendido conforme necessário.

3

Schedulers.newThread()

Cria e retorna um Scheduler que cria um novo Thread para cada unidade de trabalho.

4

Schedulers.trampoline()

Cria e retorna um Scheduler que enfileira o trabalho no thread atual para ser executado após a conclusão do trabalho atual.

4

Schedulers.from(java.util.concurrent.Executor executor)

Converte um Executor em uma nova instância do Scheduler.

O método Schedulers.trampoline () cria e retorna um Scheduler que enfileira o trabalho no thread atual para ser executado após a conclusão do trabalho atual.

Schedulers.trampoline () Exemplo

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import java.util.Random;

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

public class ObservableTester  {
   public static void main(String[] args) throws InterruptedException {
      Observable.just("A", "AB", "ABC")
         .flatMap(v -> getLengthWithDelay(v)
         .doOnNext(s -> System.out.println("Processing Thread " 
            + Thread.currentThread().getName()))
         .subscribeOn(Schedulers.trampoline()))
         .subscribe(length -> System.out.println("Receiver Thread " 
            + Thread.currentThread().getName() 
            + ", Item length " + length));

         Thread.sleep(10000);
   }
   protected static Observable<Integer> getLengthWithDelay(String v) {
      Random random = new Random();
      try {
         Thread.sleep(random.nextInt(3) * 1000);
         return Observable.just(v.length());
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      return null;
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Processing Thread main
Receiver Thread main, Item length 1
Processing Thread main
Receiver Thread main, Item length 2
Processing Thread main
Receiver Thread main, Item length 3

O método Schedulers.newThread () cria e retorna um Scheduler que cria um novo Thread para cada unidade de trabalho.

Schedulers.newThread () Exemplo

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import java.util.Random;

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

public class ObservableTester  {
   public static void main(String[] args) throws InterruptedException {
      Observable.just("A", "AB", "ABC")
         .flatMap(v -> getLengthWithDelay(v)
         .doOnNext(s -> System.out.println("Processing Thread " 
            + Thread.currentThread().getName()))
         .subscribeOn(Schedulers.newThread()))
         .subscribe(length -> System.out.println("Receiver Thread " 
            + Thread.currentThread().getName() 
            + ", Item length " + length));

         Thread.sleep(10000);
   }
   protected static Observable<Integer> getLengthWithDelay(String v) {
      Random random = new Random();
      try {
         Thread.sleep(random.nextInt(3) * 1000);
         return Observable.just(v.length());
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      return null;
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Processing Thread RxNewThreadScheduler-1
Receiver Thread RxNewThreadScheduler-1, Item length 1
Processing Thread RxNewThreadScheduler-2
Receiver Thread RxNewThreadScheduler-2, Item length 2
Processing Thread RxNewThreadScheduler-3
Receiver Thread RxNewThreadScheduler-3, Item length 3

O método Schedulers.computation () cria e retorna um Scheduler destinado ao trabalho computacional. A contagem de threads a serem agendados depende das CPUs presentes no sistema. Um thread é permitido por CPU. Melhor para loops de eventos ou operações de retorno de chamada.

Schedulers.computation () Exemplo

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import java.util.Random;

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

public class ObservableTester  {
   public static void main(String[] args) throws InterruptedException {
      Observable.just("A", "AB", "ABC")
         .flatMap(v -> getLengthWithDelay(v)
         .doOnNext(s -> System.out.println("Processing Thread " 
            + Thread.currentThread().getName()))
         .subscribeOn(Schedulers.computation()))
         .subscribe(length -> System.out.println("Receiver Thread " 
            + Thread.currentThread().getName() 
            + ", Item length " + length));

         Thread.sleep(10000);
   }
   protected static Observable<Integer> getLengthWithDelay(String v) {
      Random random = new Random();
      try {
         Thread.sleep(random.nextInt(3) * 1000);
         return Observable.just(v.length());
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      return null;
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Processing Thread RxComputationThreadPool-1
Receiver Thread RxComputationThreadPool-1, Item length 1
Processing Thread RxComputationThreadPool-2
Receiver Thread RxComputationThreadPool-2, Item length 2
Processing Thread RxComputationThreadPool-3
Receiver Thread RxComputationThreadPool-3, Item length 3

O método Schedulers.io () cria e retorna um Scheduler destinado ao trabalho vinculado a E / S. O pool de threads pode ser estendido conforme necessário. Melhor para operações intensivas de E / S.

Schedulers.io () Exemplo

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import java.util.Random;

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

public class ObservableTester  {
   public static void main(String[] args) throws InterruptedException {
      Observable.just("A", "AB", "ABC")
         .flatMap(v -> getLengthWithDelay(v)
         .doOnNext(s -> System.out.println("Processing Thread " 
            + Thread.currentThread().getName()))
         .subscribeOn(Schedulers.io()))
         .subscribe(length -> System.out.println("Receiver Thread " 
            + Thread.currentThread().getName() 
            + ", Item length " + length));

         Thread.sleep(10000);
   }
   protected static Observable<Integer> getLengthWithDelay(String v) {
      Random random = new Random();
      try {
         Thread.sleep(random.nextInt(3) * 1000);
         return Observable.just(v.length());
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      return null;
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Processing Thread RxCachedThreadScheduler-1
Receiver Thread RxCachedThreadScheduler-1, Item length 1
Processing Thread RxCachedThreadScheduler-1
Receiver Thread RxCachedThreadScheduler-1, Item length 2
Processing Thread RxCachedThreadScheduler-1
Receiver Thread RxCachedThreadScheduler-1, Item length 3

O método Schedulers.from (Executor) converte um Executor em uma nova instância do Scheduler.

Schedulers.from (Executor) Exemplo

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import java.util.Random;
import java.util.concurrent.Executors;

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

public class ObservableTester  {
   public static void main(String[] args) throws InterruptedException {
      Observable.just("A", "AB", "ABC")
         .flatMap(v -> getLengthWithDelay(v)
         .doOnNext(s -> System.out.println("Processing Thread " 
            + Thread.currentThread().getName()))
         .subscribeOn(Schedulers.from(Executors.newFixedThreadPool(3))))
         .subscribe(length -> System.out.println("Receiver Thread " 
            + Thread.currentThread().getName() 
            + ", Item length " + length));

         Thread.sleep(10000);
   }
   protected static Observable<Integer> getLengthWithDelay(String v) {
      Random random = new Random();
      try {
         Thread.sleep(random.nextInt(3) * 1000);
         return Observable.just(v.length());
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      return null;
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Processing Thread pool-1-thread-1
Processing Thread pool-3-thread-1
Receiver Thread pool-1-thread-1, Item length 1
Processing Thread pool-4-thread-1
Receiver Thread pool-4-thread-1, Item length 3
Receiver Thread pool-3-thread-1, Item length 2

O operador de buffer permite reunir itens emitidos por um Observable em uma lista ou pacotes e emitir esses pacotes em vez de itens. No exemplo abaixo, criamos um Observable para emitir 9 itens e usando buffering, 3 itens serão emitidos juntos.

Exemplo de Buffering

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class ObservableTester {
   public static void main(String[] args) throws InterruptedException {
      Observable<Integer> observable = Observable.just(1, 2, 3, 4,
         5, 6, 7, 8, 9);

      observable.subscribeOn(Schedulers.io())
         .delay(2, TimeUnit.SECONDS, Schedulers.io())
         .buffer(3)
         .subscribe(new Observer<List<Integer>>() {
            @Override
            public void onSubscribe(Disposable d) {
               System.out.println("Subscribed");
            }
            @Override
            public void onNext(List<Integer> integers) {
               System.out.println("onNext: ");
               for (Integer value : integers) {
                  System.out.println(value);
               }
            }
            @Override
            public void onError(Throwable e) {
               System.out.println("Error");
            }

            @Override
            public void onComplete() {
               System.out.println("Done! ");
            }
         });
      Thread.sleep(3000);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Subscribed
onNext: 
1
2
3
onNext: 
4
5
6
onNext: 
7
8
9
Done!

O operador de janela funciona de forma semelhante ao operador de buffer, mas permite reunir itens emitidos por um Observable em outro observável em vez de coleção e emitir esses Observáveis ​​em vez de coleções. No exemplo abaixo, criamos um Observable para emitir 9 itens e, usando o operador de janela, 3 Observable serão emitidos juntos.

Exemplo de janela

Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C: \> RxJava.

ObservableTester.java

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

import java.util.concurrent.TimeUnit;

public class ObservableTester {
   public static void main(String[] args) throws InterruptedException {
      Observable<Integer> observable = Observable.just(1, 2, 3, 4,
         5, 6, 7, 8, 9);

      observable.subscribeOn(Schedulers.io())
         .delay(2, TimeUnit.SECONDS, Schedulers.io())
         .window(3)
         .subscribe(new Observer<Observable<Integer>>() {
            @Override
            public void onSubscribe(Disposable d) {
               System.out.println("Subscribed");
            }
            @Override
            public void onNext(Observable<Integer> integers) {
               System.out.println("onNext: ");
               integers.subscribe(value -> System.out.println(value));
            }
            @Override
            public void onError(Throwable e) {
               System.out.println("Error");
            }

            @Override
            public void onComplete() {
               System.out.println("Done! ");
            }
         });
      Thread.sleep(3000);
   }
}

Verifique o resultado

Compile a classe usando javac compilador da seguinte forma -

C:\RxJava>javac ObservableTester.java

Agora execute o ObservableTester da seguinte maneira -

C:\RxJava>java ObservableTester

Ele deve produzir a seguinte saída -

Subscribed
onNext: 
1
2
3
onNext: 
4
5
6
onNext: 
7
8
9
Done!