【问题标题】:Skipping last duplicate with RxJava使用 RxJava 跳过最后一个副本
【发布时间】:2015-03-09 12:42:06
【问题描述】:

假设我们有一个主题用来发布一些事件

subject.onNext(...)

最终订阅者通过从该主题创建的 Observable 进行订阅...

我想知道我们是否可以为 observable 添加一些逻辑,这样如果它获得相同的值,它就不会将其传播给订阅者……或者更复杂的东西……?

是否有可能从主体创建一个 observable,在向其订阅者发出值之前执行一些代码?

【问题讨论】:

    标签: java reactive-programming rx-java


    【解决方案1】:

    有一个 distinctUntilChanged 运算符,如果连续发出多次,则会跳过一个值。

    如果您需要更一般的行为并希望根据某些条件跳过值,那么filter 可能就是您要找的。​​p>

    【讨论】:

    • 它将区分所有重复项,但我只需要最后一个,它的值是通过调度 http 调用然后将字符串解析为 java 对象来发出的......如果响应被缓存,我不希望它发出值...
    • 但问题更笼统......假设它有一些不同的任务,而不是区别......是否可以在可观察到的发出值之前执行一些逻辑(如果必要的话可以取消发射)......?
    • 过滤器似乎是我想要的,但我真的不知道如何将最后一个值保存在某处(除非我实现自定义 observable)以及如何访问它以与新值进行比较?
    • @Vach, distinctUntilChanged 使用filter 实现有点棘手,因为您需要保留已发出项目的历史记录。 RxJava 的功能特性禁止将具有副作用的函数传递给 filter,保留历史记录绝对是一个副作用。我建议看一下OperatorDistinctUntilChanged implementation,看看它是如何使用自定义运算符实现的。
    • 已经看过了,它只是传递身份(引用),所以我将其更改为 Object::hashcode 但它不起作用...如果 distictUntilChanged 有效,我将不需要过滤器...麻烦是我正在从 publishSubject 创建 observable,然后我将所有值推送到该主题并期望 observable 来区分变化,但它不会......我认为它直接将 onNext 调用发送给它的订阅者......
    【解决方案2】:

    似乎distictUntilChanged 正是这种情况下所必需的......

    【讨论】:

      【解决方案3】:

      过滤器似乎是我想要的,但我真的不知道如何将最后一个值保留在某个地方(除非我实现自定义 observable)以及如何访问它以与新值进行比较?

      您可以使用.buffer(2, 1).filter(...),以便filter 可以访问当前元素和最后一个元素。

      【讨论】:

        猜你喜欢
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 2019-01-01
        • 2016-10-04
        • 2015-04-02
        • 2018-09-24
        • 2019-07-09
        相关资源
        最近更新 更多