2016-07-30 15 views
3

ich RxJava für mein Projekt bin mit und ich bin ein wenig mit diesem Stück Code verwirrt:Was ist die beste Vorgehensweise für die Rückgabe von Ergebnissen aus Observablen in einem Observable?

@Override 
    public Observable<Hexagon<T>> getHexagons() { 
     return Observable.create(new OnSubscribe<Hexagon<T>>() { 
      @Override 
      public void call(final Subscriber<? super Hexagon<T>> subscriber) { 
       hexagonDataStorage.getCoordinates().subscribe(new Subscriber<CubeCoordinate>() { 
        @Override 
        public void onCompleted() { 
         subscriber.onCompleted(); 
        } 

        @Override 
        public void onError(final Throwable throwable) { 
         System.err.println(String.format("Cannot get Hexagons: <%s>", throwable.getMessage())); 
        } 

        @Override 
        public void onNext(final CubeCoordinate cubeCoordinate) { 
         subscriber.onNext(new HexagonImpl<>(gridData, cubeCoordinate, hexagonDataStorage)); 
        } 
       }); 
      } 
     }); 
    } 

Was ich versuche im Grunde hier zu tun ist, um

  • alle CubeCoordinate bekommen Objekte durch die getCoordinates Methode aufrufen, die in der Tat ein Observable
  • verwandeln die CubeCoordinate Objekte in Hexagon Objekte zurückgibt und das Ergebnis als neue Observable zurückzukehren.

Dieses Beispiel funktioniert, aber es ist wirklich ermüdend für meine Augen und riecht auch. Gibt es einen besseren Weg, um das gleiche Ergebnis zu erzielen?

Gibt es auch eine Implementierung von Subscriber, die mich nur übersteuert onCompleted und onNext? onError wird in meinem Fall nicht benötigt. Ich habe den Quellcode überprüft, aber es gibt eine Vielzahl von Implementierungen, und ich kann anhand meiner Kriterien nicht unterscheiden.

Antwort

3

Ihre erste Frage zu beantworten - der Betreiber die Sie suchen, ist map:

public Observable<Hexagon<T>> getHexagons() { 
    return hexagonDataStorage.getCoordinates() 
      .map(cubeCoordinate -> new HexagonImpl<>(gridData, cubeCoordinate, hexagonDataStorage)) 
} 

Es tut genau das, was Sie wollen - es jedes Element wandelt durch eine Funktion anwenden.


Ihre zweite Frage zu beantworten - ich sehr immer schlage vor, Sie onError außer Kraft setzen, sonst, wenn der RxJava Strom eine Ausnahme trifft, wird es OnErrorNotImplementedException werfen. Sie können eine abstrakte Klasse erstellen, die Subscriber erweitert und onError dort implementieren und die anderen beiden Methoden abstract lassen.

+0

Ich sehe. Ich benutze Java 7 hier, also habe ich keine lambdas, aber ich werde mir das anschauen, danke! –