编程语言
首页 > 编程语言> > java-在Observable中返回从Observables收集的结果的最佳实践是什么?

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