Конструкция реактора с расчетными значениями

Я пытаюсь понять, как создать дизайн для приложения, которое будет использовать Project Reactor. Скажем, у меня есть электронная таблица, например приложение, в котором значения должны обновляться на основе других значений. Для значений определены формулы. Итак, пример:

A = 1.5B + C

Я думаю, что A, B и C будут своего рода Flux (но я не уверен в конкретной реализации, которую я бы использовал), потому что любое из значений может измениться в зависимости от ввода пользователя или потому что C может быть основан на другом формула (например, C = D * E). Но вот изюминка: если A.Jurisдикция = "MI", то формула будет иметь следующий вид:

A = 1.25B + 1.25C

Разумеется, за исключением того, что реальность бизнеса такова, что существует множество причуд, возможно, существует 20 различных вариантов, а не только два.

Я знаю, как это сделать объектно-ориентированным способом, но я пытаюсь понять, как это сделать, используя реактивные потоки / Reactor.

Изменить: я пытаюсь выяснить, как / если это можно полностью сделать декларативным способом.


person Bill Davis    schedule 27.02.2017    source источник


Ответы (2)


Похоже, вы хотите представить свои ячейки как 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.

Основная трудность будет заключаться в том, чтобы «редактируемые ячейки» (в отличие от «ячеек с формулами», здесь B и C) отображали обновления, вводимые пользователем, как Flux<Double>.

Вы можете посмотреть Flux.create(), например. попробуйте связать события редактирования в пользовательском интерфейсе с Flux<Double>.

person Simon Baslé    schedule 01.03.2017

Краткий ответ из моих исследований - посмотреть это видео и применить уроки:

Разработка реактивных приложений с реактивными потоками и Java 8, Брайан Клозель, Себастьян Делёз - Devoxx

person Bill Davis    schedule 28.02.2017