当前位置: 首页 > 知识库问答 >
问题:

单声道与磁通相结合

吴兴国
2023-03-14

我有一个简单的任务。我想在订单中添加产品。

public Mono<OrderDTO> addProductsToOrder(String orderId, String[] productIds)
{

    final List<String> productIdsList = Arrays.asList(productIds);

    final Mono<Order> order = orderRepository.findById(orderId)
                                             .switchIfEmpty(orderShouldExists(orderId));

    final Flux<BaseProductInfo> products = fromIterable(productIdsList)
        .flatMap(productId -> productRepository.findById(productId)
                                               .switchIfEmpty(productShouldExists(productId)));

    return order.then(combineLatest(order, products, Tuples::of)
                          .map(objects -> objects.getT1().addProduct(objects.getT2()))
                          .take(productIdsList.size())
                          .last()
                          .flatMap(orderRepository::save)
                          .map(orderMapper::mapToDTO));
}

我还想实现的是返回更新的订单。下面的代码不能像我希望的那样工作。有时所有的产品都被保存,有时一个也没有。我使用的数据库是被动mongo。

共有2个答案

卫昊东
2023-03-14

从您的代码中,看起来您正试图将BaseProductInfo的列表添加订单中并保存。您可以通过执行以下操作来实现这一点:

    public Mono<OrderDTO> addProductsToOrder(String orderId, String[] productIds) {

    final List<String> productIdsList = Arrays.asList(productIds);

    final Mono<Order> order = orderRepository.findById(orderId)
                                             .switchIfEmpty(orderShouldExists(orderId));

    final Mono<List<BaseProductInfo>> products = fromIterable(productIdsList)
        .flatMap(productId -> productRepository.findById(productId)
                                               .switchIfEmpty(productShouldExists(productId)))
.collectList();

    return order.zipWith(products).map(tuple -> tuple.getT1().addProducts(tuple.getT2)).flatMap(orderRepository::save)
                          .map(orderMapper::mapToDTO));
}

夏烨霖
2023-03-14

我用这种方法解决了这个问题。

public Mono<OrderDTO> addProductsToOrder(String orderId, String[] productIds)
{
    return orderRepository.findById(orderId)
                          .switchIfEmpty(orderShouldExists(orderId))
                          .flatMap(order -> Flux
                                       .fromArray(productIds)
                                       .flatMap(productId -> productRepository.findById(productId)
                                                                              .switchIfEmpty(productShouldExists(productId))
                                               )
                                       .doOnNext(order::addProduct)
                                       .then(Mono.just(order))
                                  )
                          .flatMap(orderRepository::save)
                          .map(orderMapper::mapToDTO);
}
 类似资料:
  • 我想创建一个SpringWebFlux服务,它将两个源的数据与一个依赖项相结合。我是Webflux的新手,所以我不知道怎么做。下面是一些伪代码来说明我要做的事情: 的结果包括我想用查找的数据的标识符。至少我想处理这两个数据集。我可以使用什么方法代替第一个?

  • 我有一个 其中func()返回Mono。将此对象列表转换为并从流返回的最简单方法是什么?

  • 问题方法需要等待单声道操作结果,在通量操作中使用,并返回通量。 研究我希望流被Mongo反应驱动订阅并终止,所以我不订阅。如果我使用我有单声道 任务如何等待值,在通量操作中使用它并从中获取通量?

  • 如何使用或从方法参数使用或。假设我定义了接口,如下所示,其中使用创建employee对象 但是可以使用对象来完成,如下所示。 但是有没有办法直接使用或来消费呢?

  • 我的理解是单声道 我说得对吗? 如果没有,单声道之间的区别是什么

  • 我的代码如下。我需要从mongo db获得每次旅行的车费,然后将每次旅行的所有车费相加,得到总车费。我被一种我不知道如何阅读的单声道音乐所困扰。我试着把它转换成通量,但我得到了通量 "'