Плоская карта реактора внутри плоской карты - PullRequest
0 голосов
/ 06 апреля 2020

Я столкнулся с проблемой при преобразовании двух потоков в однопоточный, в то время как второй поток зависит от первого потока.

В традиционном нереактивном программировании мой код был бы написан следующим образом.

public OrderEstimationsResult getEstimations(ObjectId productId, int quantity, float longitude, float latitude, ShipmentMethod shipmentMethod) {
    Product product = productService.getById(productId);
    ShippingEstimationResult estimation = shippingService.getEstimations(product.getWeight(), product.getLocation(), new Location(longitude, latitude), new Date(), ShipmentMethod.FAST);
    float price = productService.calculatePrice(product, quantity);
    return new OrderEstimationsResult(price, estimation.getEstimatedCost(), new Date());
}

Мне удалось сделать это, используя flatmap внутри flatmap в реактивном программировании.

public Mono<OrderEstimationsResult> getEstimations(ObjectId productId, int quantity, float longitude, float latitude, ShipmentMethod shipmentMethod) {
    return productService
            .getById(productId)
            .flatMap(product -> shippingService
                    .getEstimations(product.getWeight(), product.getLocation(), new Location(longitude, latitude), new Date(), ShipmentMethod.FAST)
                    .flatMap(estimation -> {
                        float price = productService.calculatePrice(product, quantity);
                        return Mono.just(new OrderEstimationsResult(price, estimation.getEstimatedCost(), new Date()));
                    })
            );
}

Может ли кто-нибудь сказать, использую ли я правильный / лучший подход?

...