【问题标题】:How do I prepend first element of Observable<T> to each group?如何将 Observable<T> 的第一个元素添加到每个组?
【发布时间】:2018-03-21 20:14:18
【问题描述】:

假设我有Observable&lt;String&gt; playerNames,其中第一个元素是标题。如何将其分解为多个块(同时为每个组添加标题)?

playerNamesObservable
     .window(100)
     .to(chunk -> { return playerNamesObservable.concatWith(chunk) }

headerObservable 基本上是playerNamesObservable.first()

问题是我想非常小心发射项目(不想使用blockingGet等)

谢谢

【问题讨论】:

    标签: rx-java rx-java2


    【解决方案1】:

    使用publish:

    recordsObservable.publish(shared -> {
        Observable<String> first = shared
            .take(1)
            .replay()
            .autoConnect(0);
    
        return shared.skip(1)
            .window(100)
            .map(w -> w.startWith(first));
    })
    .flatMap(chunk -> /* consume each chunk */)
    

    【讨论】:

    • 你能解释一下为什么我们需要autoConnect(0)吗?我读过 .replay() 并且我相信它应该在没有 autoConnect(0) 的情况下工作。
    • 您需要手动建立与第一个元素的连接,因为map 中的startWith 执行得太晚,而第一个元素到那时就会丢失。
    • 我可以用简单的 .cache() 替换 .replay().autoConnect(0) 吗?
    • 不,您必须在该路径上触发订阅到共享Observable
    • 您好,您的解决方案在 recordsObservable.count() == 1 时不起作用。有机会解决它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2014-06-23
    相关资源
    最近更新 更多