- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们需要以某种方式转换一个热 Observable,我们需要知道它之前发出的所有项目才能确定接下来要发出什么。我发现最方便的解决方案是将 Func1 子类的实例传递给 flatMap,它具有全局状态(例如,以前发出的项目的 map 或列表)。在每次调用中,Func1 实例都会更新其状态,并根据该状态决定返回什么。
但是,我担心这个解决方案的“好”程度。据我所知,RxJava 不能很好地处理全局和可变状态,这个解决方案似乎与之形成对比。另一方面,我确信我的 Observable 履行了 Observable 契约,因此它似乎至少是一个可行的解决方案,如果它可以并发调用,同步将解决问题。
其他可能的解决方案可能是:
创建运算符(operator)。我猜 Operators 中的可变状态是允许的。无论如何,我尽量避免自定义运算符,因为它们更棘手。
通过扫描(在列表或 map 中)传播 Observable 的历史记录。我要么对每个发出的项目使用相同的对象(List 或 Map),这会在流中引入一个可变对象,要么每次都复制整个对象,这会浪费很多性能。
订阅原始 Observable,修改订阅者的一些全局状态,并使用此全局状态在 Subject(转换后的 Observable)上发射项目。我想到这个是因为它在处理全局状态(和同步)时似乎退出了 RxJava 的范围。
所以问题是:我是否应该在 flatMap 中使用具有可变状态的 Func1 实现来根据先前发出的项目的历史记录来转换项目(顺便说一句,这是有效的),如果不是,我应该使用什么替代方案?总的来说,我对处理 Observable 转换所需的复杂可变状态的推荐方法感到困惑。
我希望我已经清楚地表达了我的问题。否则,请告诉我,我会尝试借助一些具体问题和代码来描述它。
最佳答案
通常不推荐包含可变状态的函数流,因为可变状态可能会在多个 Subscriber
之间共享到特定的 Observable
链。不过,大多数开发人员通常会在需要时组装 Observable
并且很少重用相同的 Observable
。例如,一个按钮点击处理程序将创建一个 Observable
,通过组合, fork 出另外两个 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
字段。
关于java - 在提供给 flatMap 的 RxJava Func1 对象中使用可变状态是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47040402/
我有一个对象Foo,其中包含Bar列表。这些类的描述如下: class Foo { String name; List bars = new ArrayList(); Foo(
根据 Mozilla 开发者网站: flatMap() 方法首先使用映射函数映射每个元素,然后将结果展平到一个新数组中。它与 map 后跟深度为 1 的 flat 相同,但 flatMap 通常非常有
我对无法找到该问题的现有问题感到非常惊讶。这是为什么,鉴于: val p: Int => Option[Int] = Some(_) List(1, 2, 3).flatMap(p) 我得到: :14
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我想知道两种平面映射情况之间是否存在显着差异。 案例 1: someCollection .stream() .map(CollectionElement::getAnotherCol
以下是flatMap的定义取自 scala.util.Success。 final case class Success[+T](value: T) extends Try[T] { def fl
我正在寻找一个函数来展平列表数组。首先,我在 RDD 系统上使用 Apach Spark 函数 flatMap 实现了我的解决方案,但我想在本地执行此操作。但是,我无法找到 的等价物 samples
我想知道是否存在忽略 flatMap 中的结果的函数(在 scala 或 cat 中) .例如。 Some("ignore this").ignoreArgumentFlatMap(Some("res
我正在学习 Scala 并解决了 99 个 Scala 问题。对于以下练习: 展平嵌套列表结构。示例: scala> flatten(List(List(1, 1), 2, List(3, List(
当编译器进入无限循环时,是否有人遇到过使用此类 flatMap 链(或什至更长)的问题。 let what = Future.init { (promise) in promise(.succ
有没有更好的函数方式来写 flatMap ? def flatMap[A,B](list: List[A])(f: A => List[B]): List[B] = list.map(x =>
我试图从两个 中变出笛卡尔积潜在无限然后我通过 limit() 限制的流. 到目前为止,这(大约)是我的策略: @Test void flatMapIsLazy() { Stream.
为什么以下声明对 .map() 有效但不适用于 .flatMap() ? val tupled = input.map(x => (x*2, x*3)) //Compilation error:
我正在寻找可以同时映射和展平 Lists 和 Maybes 的代码。我在 this topic 中发现了这样一个 flatMap 函数: flatMap :: (t -> [a]) -> [t] ->
考虑在某些大小写匹配上编写的 flatMap。例如: list.flatMap( v => v match { case Cond1 => if(something) Some
我无法使用ListKOf平面映射T -> Option。 例如 listOf(1,2,3).k().flatMap { i -> if (i % 2 == 0) Some(i) else None
有人可以解释我如何在RxJava中通过flatMap运算符传递onComplete信号吗? 如果对flatMap运算符进行注释,则可以获取1到10的数字列表,这意味着toList将收到onComple
我正在做一个在线类(class)并误读了一个问题(这就是为什么我认为可以发布这个问题,因为答案与类(class)中的问题无关!)。 data class Trip( val drive
给定作为数据类的二维坐标列表 data class Point(val x: Int, val y:Int) val points: List 和 TornadoFX(Kotlin 中的 JavaFX
这个问题已经有答案了: What is the difference between .stream() and Stream.of? (5 个回答) 已关闭 3 年前。 我有以下代码: List p
我是一名优秀的程序员,十分优秀!