当前位置: 首页 > 知识库问答 >
问题:

如何使用RxJava将双值嵌套列表转换为Java类?

时经纬
2023-03-14

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

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

下面是实际加载数据的例程。我正在使用RxAndroid并在这里进行改装。

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) {}
        });

}

如何映射内部列表

public class ProductLevel {

    public Double mTimeStamp;
    public Double mLevel;

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

}

最后,我想收到这个:列表


共有3个答案

卢黎明
2023-03-14

如果您将ReadProductLevel更改为一次发出一个列表项,那么您可以一次对它们做出一个反应:

在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));
                            }
                        });

    }
樊奇思
2023-03-14
List<ProductLevel> productLevels = new ArrayList<>();
for(List<Double> p: list) {
    productLevels.add(new ProductLevel(p.get(0),p.get(1)));
}

我认为它应该有效。

凌远
2023-03-14
匿名用户

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

因此,您要发出每一对,并将每一对转换为ProductLevel

要做到这一点,您必须flatMap您的配对列表才能发射每个配对。然后将每对映射到产品级。最后,只需构建一个包含所有发射项的列表。

(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 -> /** ... **/);

 类似资料:
  • 问题内容: 我该如何打开一个列表,例如: 进入列表列表,例如: 即我想将有序元素分组在列表中,并将其保留在有序列表中。我怎样才能做到这一点? 谢谢 问题答案: 假设data_list的长度是三的倍数

  • 当我试图使用ModelMapper将嵌套的java对象转换为嵌套的DTO时,我遇到了一个问题。在父DTO对象中,子DTO为null。以下是代码片段。 实体类: DTO的课程: 这是映射器代码: 输出: 输出用户DTO:UserDTO[名称=xyz,地址=null,产品=null] 在这里,我想将用户实体转换为UserDTO-dto。我得到了地址和产品DTO的空值。我在这里到底缺少什么?有人知道吗?

  • 我在Firebase中有以下数据: 在Flutter中,我有以下两个对象: 我正在尝试将Firebase中的集合嵌套贴图转换为Flatter中的列表,但遇到了问题。在Flatter中将具有贴图字段的贴图对象转换为列表的最佳方法是什么? 我知道我在处理map对象时遇到了问题,根据我的方法,我收到了不同的错误,但通常类似于以下情况之一: 错误1:“键入“\u InternalLinkedHashMap

  • 我正在制作一个程序,将图片转换成灰度形式,然后从灰度形式转换成公平格式。 我正在使用嵌套的for-loops来转换嵌套列表。这工作得很好,但我希望使用流来实现,如果使用流,输出会发生变化,但我认为应该得到相同的输出。我错在哪? grayPhoto是 你们有没有看到我做错了什么或者小溪应该是怎样的?

  • 在索引位置1的输入中遇到的字符串的前半部分将被替换为字符“-”使用流我们如何执行操作? 我有上面的列表,我想用我这样做的循环将每个嵌套列表值的第一个位置替换为“-” 样本输出:[[0,-],[6,-],[0,-],[6,gh],[4,ij],[0,ab],[6,cd]] 但是任何人都可以解释如何使用流来实现同样的目标

  • 我正在尝试将列表拆分为列表列表,其中每个列表的最大大小为4。 我想知道如何使用lambdas做到这一点。 目前我的做法如下: 更新 似乎没有一种简单的方法可以使用lambdas来拆分列表。虽然所有的答案都很受欢迎,但它们也是一个很好的例子,说明lambdas不能简化事情。