当前位置: 首页 > 知识库问答 >
问题:

在给定给FlatMap的RxJava Func1对象中使用可变状态是一个好主意吗?

闻人树
2023-03-14

假设我们需要转换一个hot Observable,我们需要知道它以前发出的所有项,以便能够确定下一步要发出什么。我发现最方便的解决方案是将Func1子类的一个实例传递给FlatMap,该子类具有全局状态(例如,一个映射或先前发出的项列表)。在每个调用中,Func1实例将更新其状态,并根据该状态决定返回什么。

但是,我担心这个解决方案的“美好”。据我所知,RxJava在全局和可变状态方面并不是很好,而这个解决方案似乎与之形成了对比。另一方面,我确信我的Observable实现了Observable契约,因此它似乎至少是一个工作解决方案,如果可以并发调用它,同步将解决问题。

其他可能的解决办法是:

通过扫描(在列表或地图中)传播可观察的历史。我要么对每个发出的项使用相同的对象(列表或映射),这将向流中引入一个可变对象,要么每次都复制整个对象,这将浪费大量性能。

订阅原始的Observable,从订阅服务器修改一些全局状态,并使用该全局状态在主题(转换的Observable)上发出项。我之所以这么想,是因为当它处理全局状态(和同步)时,它似乎退出了RxJava的范围。

所以问题是:我是否应该使用flatMap中具有可变状态的Func1实现来基于先前发出的项的历史来转换项(顺便说一句,它起作用了),如果不是,我应该使用什么替代方案?一般而言,我对处理可观察对象转换所需的复杂可变状态的推荐方法感到困惑。

我希望我已经清楚地表达了我的问题。否则,让我知道,我会尝试在一些具体问题和代码的帮助下描述它。

共有1个答案

燕正德
2023-03-14

通常不建议使用包含可变状态的函数的流,因为可变状态可能会在多个订阅者之间共享到特定的可观察链。然而,大多数开发人员通常会在需要时汇编observable,而很少重用相同的observable。例如,按钮单击处理程序将创建一个observable,该observable通过组合将其他两个observable分开,以异步地从两个不同的地方获取数据,然后订阅这个线程本地的observable实例。单击一个新的按钮将使用一个新的独立的observable来重复这个过程。

以下是有状态函数问题的解决方案:使有状态位的存在取决于订阅的单个订阅者:defer()

Observable<Integer> o = Observable.defer(() -> {
    return Observable.range(1, 10)
            .map(new Func1<Integer, Integer>() {
                int sum;
                @Override
                public Integer call(Integer v) {
                    sum += v;
                    return sum;
                }
            });
});

o.subscribe(System.out::println);
o.subscribe(System.out::println);

由于将为每个subscribe调用创建func1内部类,因此其sum字段对于每个单独的使用者都是本地的。还请注意,sum将返回并自动装箱到一个不可变的integer,然后可以在其他线程中自由读取它(想想observeon),因为它完全脱离了sum字段。

 类似资料:
  • 问题内容: 我最近发现了如何通过此方法在python中动态创建变量: 从而创建变量。 我的问题是,这是个好主意吗?还是应该总是提前声明变量? 问题答案: 我认为最好使用字典: 我认为这更像Python。

  • 我有一个相当简单的管道(代码比文字更好): 我的问题是,对于给定的窗口,我必须根据以下内容计算新的状态: 上一个状态(即上一个窗口的计算状态) 接收的事件 我希望避免调用外部服务来获取上一个状态,而是获取上一个窗口的状态。有可能吗?

  • 问题内容: 例如,这是个好主意吗? 如果您在同一台服务器上有两个虚拟主机,一个虚拟主机,一个虚拟主机,并且使用不同的Apache DocumentRoots,则这将避免当include的来源未知并且可以在任何目录中时,不必包含绝对路径。 (注意:以下部分中的文件路径是相对于Web根目录的。实际上,它们类似于,其中Web根目录在哪里) 例如:我有一个/core/init.php,它是使用来自网站(,

  • 问题内容: 我已经多次听到您不应该执行或出于性能方面的考虑,但是无法深入了解有关它的更多信息。 我可以想象数据库随后将 所有 列都用于操作,这可能会导致性能下降,但是我不确定。有人有关于该主题的更多信息吗? 问题答案: 1.关于count(*)vs. count(其他) SQL是声明性的,您可以指定所需的 内容 。这不同于指定 如何 获得所需的东西。这意味着数据库引擎可以自由地以其认为最有效的方式

  • 问题内容: 我公司在另一个国家/地区拥有一个开发团队,他们坚持使用Vue在我们现有平台的基础上构建新模块。我们的主要平台是基于React与Redux构建的单页面应用程序。 仅基于团队技能的混合框架是一个好主意吗?这两个框架是否可行? 问题答案: 如果主要原因是“我已经知道Vue”,那么我会拒绝。 如果他们已经知道Vue,应该很容易学会反应。 我认为这两个框架可以协同工作,您可以在使用Vue构建的R