如何使用 RxJava 将嵌套的 double 值列表转换为 Java class?

How to transform a nested list of double values into a Java class using RxJava?

在我的 Android 客户端中,我从后端收到此 JSON 数据:

[
    [
        1427378400000,
        553
    ],
    [
        1427382000000,
        553
    ]
]

这是实际加载数据的例程。我在这里使用RxAndroid and Retrofit

private void getProductLevels() {
    Observable<List<List<Double>>> responseObservable =
        mProductService.readProductLevels();
    AppObservable.bindFragment(this, responseObservable)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        // TODO: Transform List<List<Double>> into List<ProductLevel>
        .subscribe(new Subscriber<List<List<Double>>>() {
            @Override
            public void onCompleted() {}

            @Override
            public void onError(Throwable e) {}

            @Override
            public void onNext(List<List<Double>> response) {}
        });

}

如何使用 RxJava 运算符将内部 List<Double> 映射到特定的 Java class,例如 ProductLevel =28=]?

public class ProductLevel {

    public Double mTimeStamp;
    public Double mLevel;

    public ProductLevel(Double timeStamp, Double level) {
        mTimeStamp = timeStamp;
        mLevel = level;
    }

}

最后,我想收到这个:List<ProductLevel>

List<ProductLevel> productLevels = new ArrayList<>();
for(List<Double> p: list) {
    productLevels.add(new ProductLevel(p.get(0),p.get(1)));
}

我觉得应该可以。

如果您将 readProductLevels 更改为一次发出每个列表项,您可以 然后一次对他们做出反应:

在 mProductService 中:

private Observable<List<Double>> readProductLevels() {
        return Observable.create(
                new Observable.OnSubscribe<List<Double>>() {
                    @Override
                    public void call(Subscriber<? super List<Double>> subscriber) {
                        List<List<Double>> items = new ArrayList<List<Double>>();
                        List<Double> list1 = new ArrayList<Double>() {{
                            add(1D);
                            add(2D);
                        }};
                        items.add(list1);
                        List<Double> list2 = new ArrayList<Double>() {{
                            add(10D);
                            add(12D);
                        }};
                        items.add(list2);
                        List<Double> list3 = new ArrayList<Double>() {{
                            add(21D);
                            add(22D);
                        }};
                        items.add(list3);

                       // Imagine the list creation above is your Json parsing


                        for (List<Double> list : items) {
                            subscriber.onNext(list);
                        }

                        subscriber.onCompleted();
                    }
                });
    }

允许您订阅超级列表中的每个项目:

private void getProductLevels() {
        Observable<List<Double>> responseObservable = readProductLevels();
        AppObservable.bindFragment(this, responseObservable)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                        // TODO: Transform List<List<Double>> into List<ProductLevel>
                .subscribe(
                        new Subscriber<List<Double>>() {
                            @Override
                            public void onCompleted() {
                            }

                            @Override
                            public void onError(Throwable e) {
                            }

                            @Override
                            public void onNext(List<Double> response) {
                                new ProductLevel(response.get(0), response.get(1));
                            }
                        });

    }

根据您的数据,您会收到一个配对列表(时间戳、级别)。这对由仅包含 2 个值的列表表示。

所以你想发出每一对,然后将每对转换成ProductLevel

为此,您必须 flatMap 您的配对列表才能发出每一对。然后把map每对变成一个ProductLevel。最后,只需构建一个包含所有已发出项目的 list

(java8 样式)

AppObservable.bindFragment(this, responseObservable)
             .subscribeOn(Schedulers.io())
             .observeOn(AndroidSchedulers.mainThread())
             .flatMapIterable(listOfList -> listOfList) // or flatMap(l -> Observable.from(l))
             .map(pair -> new ProductLevel(pair.get(0),pair.get(1))) // build ProductLevel for each pair
             .toList() // build a list with all ProductLevel
             .subscribe(listOfProductLevel -> /** ... **/);