编程语言
首页 > 编程语言> > java-可以重用运算符执行

java-可以重用运算符执行

作者:互联网

给出以下示例(kotlin代码)

val subject = PublishSubject.create<Int>()

val stream = subject.map {
    println("mapping")
    it * 2
}

stream.forEach { println("A: $it") }
stream.forEach { println("B: $it") }

subject.onNext(1)
subject.onCompleted()

输出将是

mapping
A: 2
mapping
B: 2

我要实现的是可观察到的源被映射一次,并且所有订阅者都获得结果,但是不对它们中的每一个执行映射操作.

像这样

mapping
A: 2
B: 2

就我而言,我在延迟和性能至关重要的地方进行了非常昂贵的计算,作为一个来源和许多订户,我的观察力很强.

我们如何重用运算符执行?和通常不同的映射操作?

解决方法:

您可以使用cache来缓存对任何将来的订户可见的源结果:

val stream = subject.map {
    println("mapping")
    it * 2
}.cache()

如果要对缓存方式进行更细微的控制,则值得研究replay.

如果您不想缓存每个可观察到的源项目,而只是重新发布新项目,则可以将publishautoConnect结合使用:

val stream = subject.map {
    println("mapping")
    it * 2
}.publish()
 .autoConnect()

其中给出了以下事件顺序:

stream.forEach { println("A: $it") }
stream.forEach { println("B: $it") }

subject.onNext(1)

stream.forEach { println("C: $it") }
subject.onNext(2)
subject.onCompleted()

将打印:

mapping
A: 2
B: 2
mapping
A: 4
B: 4
C: 4

标签:rx-java,kotlin,reactive-programming,java
来源: https://codeday.me/bug/20191118/2028283.html