java-在Observable中返回从Observables收集的结果的最佳实践是什么?
作者:互联网
我在我的项目中使用RxJava,但是这段代码让我有些困惑:
@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 one rror(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));
}
});
}
});
}
我基本上想在这里做的是
>通过调用getCoordinates方法获取所有CubeCoordinate对象,该方法实际上返回一个Observable
>将CubeCoordinate对象转换为Hexagon对象,并将结果作为新的Observable返回.
这个例子很有效,但它确实使我的眼睛感到疲劳,并且闻起来也很香.有没有更好的方法来达到相同的结果?
还有一个Subscriber的实现,它只能使我覆盖onCompleted和onNext吗?在我的情况下,不需要onError.我检查了源代码,但是有大量的实现,因此无法根据我的标准进行区分.
解决方法:
要回答您的第一个问题-您要查找的运算符是map
:
public Observable<Hexagon<T>> getHexagons() {
return hexagonDataStorage.getCoordinates()
.map(cubeCoordinate -> new HexagonImpl<>(gridData, cubeCoordinate, hexagonDataStorage))
}
它完全可以实现您想要的功能-它通过应用函数来变换每个项目.
要回答第二个问题-我强烈建议您始终重写onError,否则,如果RxJava流遇到异常,它将抛出OnErrorNotImplementedException
.您可以创建一个扩展Subscriber的抽象类,并在那里实现onError并使其他两个方法保持抽象.
标签:rx-java,java-7,java 来源: https://codeday.me/bug/20191118/2027477.html