RxJava:是否可以避免toBlocking()。single()?

时间:2016-08-19 13:47:37

标签: java rx-java

我有时会使用RxJava为更复杂的过滤,映射等编写更多功能样式(我知道这不是它的用途,我很乐意使用Kotlin或Java 8,但是我不能(我在Android上,所以,坚持到6)。

但是,当您尝试从Observable中“提取”实际对象时,您始终需要编写.toList().toBlocking().singe()

E.g。 (不是那么复杂,但你明白了):

final List<CashRegister> cashRegisters = cashRegisterData.getCashRegisters();

return Observable.from(cashRegisters)
        .map(CashRegister::getName)
        .toList()
        .toBlocking()
        .single();

如您所见,将Observable“转换”为列表需要的行数多于我想要执行的实际映射。

有没有办法在没有toList().toBlocking().single()链的情况下这样做?

2 个答案:

答案 0 :(得分:1)

您可以使用IxJava执行相同的操作:

final List<CashRegister> cashRegisters = cashRegisterData.getCashRegisters();

return ix.Ix.from(cashRegisters)
    .map(CashRegister::getName)
    .toList();

答案 1 :(得分:1)

使用RxJava,必须改变他们使用Observable的方式。 可观察的操作链应该更像是数学公式,而不是一系列操作。因此,不要试图从可观察的结果中获取结果,而是试着找出你想对该列表做些什么。

在RxJava中,不要extract可观察的值,而是subscribe给他们:

someObservable.subscribe(result -> {
    // Now do your deed with the result
    // for example:
    someAdapter.setData(result);
    someAdapter.notifyDatasetChanged();
})

我建议您阅读How to use RxJava上的文档以了解这个想法。