【问题标题】:Change Data type in the RxJava2 chain更改 RxJava2 链中的数据类型
【发布时间】:2019-07-17 11:19:27
【问题描述】:

我是 RxJava2 及其方法的新手。 我需要更改从 Observable 发出的数据类型。

说,我有一个像下面这样的数据类。

data class SomeClass (val type: String)

一个 API 返回 ArrayList<SomeClass>,这在使用 RxJava2 和 RxAndroid 的当前实现上运行良好。

apiService.getPrice(code)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(singleObserver)

我必须更改/转换来自ArrayList<SomeClass> to HashMap<someClassObject.type, ArrayList<SomeClass>> 的数据。我正在尝试运营商来实现这一点,但没有运营商允许更改正在观察的数据类型。

转换基于:

Consumer<ArrayList<SomeClass>> { response ->
                    val mapped = HashMap<String, ArrayList<SomeClass>>()
                    response.forEach { someClassObj ->
                        val type = someClassObj.type!!
                        if (mapped.containsKey(type)) {
                            mapped[district]?.add(someClassObj)

                        } else {
                            val list = ArrayList<SomeClass>()
                            list.add(someClassObj)
                            mapped[type] = list
                        }
                    }
                }

我正在考虑使用两个不同的 observable,其中 Observable data #2 基于 Observable data #1 (ArrayList&lt;SomeClass&gt;) 的响应。但是,我不确定这是否有效。有没有更好或更有效的方法来实现这一目标?

【问题讨论】:

  • 尝试map(Function) 使用您显示的代码 sn-p。
  • 试过 map(),但没有用。
  • “不工作”对诊断您的问题没有多大帮助。请提供更多详细信息,说明您是如何尝试的以及结果如何:编译错误、打印的数据错误等。
  • @akarnokd:是的,我的错。对不起,我应该提供更多信息。

标签: android reactive-programming rx-java2 rx-android reactivex


【解决方案1】:

试试map:

apiService.getPrice(code)
        .map { response ->
            val mapped = HashMap<String, ArrayList<SomeClass>>()
            response.forEach { someClassObj ->
                val type = someClassObj.type!!
                if (mapped.containsKey(type)) {
                    mapped[district]?.add(someClassObj)
                } else {
                    val list = ArrayList<SomeClass>()
                    list.add(someClassObj)
                    mapped[type] = list
                }
            }
            mapped
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(singleObserver);

【讨论】:

  • 投票:map 运算符用于更改可观察数据的内容。这绝对是问题的正确答案。 :)
  • 当我尝试使用 map 运算符时,我忘记了从 map lambda 块返回值。这导致“无法将数据类型从源更改为所需的”。谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 2019-04-29
  • 2023-01-21
  • 2023-02-09
  • 1970-01-01
  • 2021-07-26
相关资源
最近更新 更多