具有计算值的反应器设计

Reactor design with calculated values

我正在尝试弄清楚如何为将使用 Project Reactor 的应用程序进行设计。假设我有一个类似应用程序的电子表格,需要根据其他值更新值。有为值定义的公式。例如:

A = 1.5B + C

我认为 A、B 和 C 都是某种 Flux(但我不确定我会使用的具体实现),因为任何值都可能根据用户输入而改变,或者因为 C可能基于另一个公式(例如 C = D * E)。但是这里有一个转折点,如果 A.Jurisdiction = "MI",那么公式就变成了:

A = 1.25B + 1.25C

当然,除了商业现实是有各种各样的怪癖,也许有 20 种不同的变体,而不仅仅是两种。

我知道如何以面向对象的方式做到这一点,但我正在努力思考如何使用反应式 streams/Reactor 来做到这一点。

编辑:我想弄清楚how/if它可以完全以声明的方式完成。

根据我目前的研究,简短的回答是观看此视频并应用课程:

Developing Reactive applications with Reactive Streams and Java 8 by Brian Clozel, Sébastien Deleuze - Devoxx

您似乎希望将您的单元格表示为 Flux<Double>,并且对任何单元格的每次更新都将是所述通量中的一个 onNext 事件,并传播到相关单元格?

为了将单元格连接在一起,combineLatest 将进行调整。您可以这样做(以您的特定示例为例):

public Flux<Double> cellA() {
    if (A.Jurisdiction.equals("MI")) {
        return Flux.combineLatest(cellB(), cellC(), (b, c) -> 1.25d * b + 1.25d * c);
    } else {
        return Flux.combineLatest(cellB(), cellC(), (b, c) -> 1.5d * b + c);
    }
}

每次任一源单元格中出现新值时,A 的通量都会更新,并将该新值和来自另一个通量的最后一次看到的值作为 BiFunction.

的输入

主要困难在于 "editable cells"(与 "formula cells" 相对,这里是 B 和 C)将用户输入的更新反映为 Flux<Double>

你可以看看 Flux.create() 例如。尝试将 UI 中的编辑事件桥接到 Flux<Double>.