Kotlin RxJava2合并缓存数据和主题

Kotlin RxJava2合并缓存数据和主题,kotlin,rx-java2,behaviorsubject,Kotlin,Rx Java2,Behaviorsubject,我有一个磁盘存储器,它从磁盘返回一个对象?(可能已保存或未保存)和一个行为主题(此数据来自其他类调用,请检查下面的代码): 代码是: private val subject: Subject<Optional<Element>> = BehaviorSubject.create() fun getElements(): Observable<List<Element>> = Observable.concat(Observable.jus

我有一个磁盘存储器,它从磁盘返回一个
对象?
(可能已保存或未保存)和一个行为主题(此数据来自其他类调用,请检查下面的代码):

代码是:

private val subject: Subject<Optional<Element>> = BehaviorSubject.create()

fun getElements(): Observable<List<Element>> =
    Observable.concat(Observable.just(storage.getElement()), subject)
        .filter({ it.isPresent })
        .take(1)
        .flatMapSingle { 
            Observable.just(it.get())
                .flatMapIterable { it.categories }
                .toList()
        }

fun updateSubject(response: Response) {
    storage.save(response.element) //Save element in storage
    subject.onNext(response.element.toOptional())
}
第一次,当存储为null时,它什么也不做,甚至我在
subject.onNext(response.element.toOptional())
中有一个断点,希望
onNext
将触发
getElements
的流,但什么也没有发生。 第二次,当我已经将接收到的元素保存到存储器中时(因此,
storage.getElement()
返回一些内容),它可以正常工作

我的功能描述是:


从缓存和主题中获取元素,首先获取到达的元素,然后返回它(第一次返回的将是主题元素),下一次,我希望第一个元素将是存储元素。

您的
.filter{it.isPresent}将过滤掉空可选元素
调用,因此不会向下游发出任何消息。

我假设存储是某种持久性对象,因此它
存储。getElement()
可能会在创建主题时返回有效对象

如果是这种情况,那么我认为您应该在创建主题之前检查是否有存储对象,如果有,请使用
BehaviorSubject.createDefalut(storedObject)
如果确实存在,或者
BehaviorSubject.create()


然后在你的
getElements()
函数中,我想你可以直接使用
subject.filter()

我也这么做了,但是有同样的问题,无论如何它应该返回subject值。对不起,subject收到了一个有效值。你能澄清一下“第一次”和“下一次”是什么意思吗?你是说你有两个订户吗?(一个在调用updateSubject之前订阅,另一个在调用updateSubject之后订阅?)
getElements().subscribe(onElements(), onError());