响应式编程 - Return 结果为空时响应

Reactive programming - Return response when the result is empty

我下面有一个响应式代码,它执行以下操作。

  1. 按 ID 查询项目 table - (itemRepository.findByd(itemId))
  2. 根据步骤 1 的结果创建地图
  3. 从数据库调用 retrieveItemsQty

此处,当Step1 return的一个或多个结果和retrieveItemsQty 方法在结果为空时失败时,它工作正常。我的要求是在第一步结果(itemRepository.findByd)为空时return返回。不确定该怎么做?

private Mono<Long> updateItemsQty(final Long itemId) {
        return itemRepository.findByd(itemId).collectList()
                .zipWhen((items) -> Mono.just(items.stream()
                        .collect(Collectors.toMap(ItemQty::getId, ItemQty::getQty))))
                .map((tuple) -> tuple.getT2())
                .zipWhen((items) -> qtyRepository
                        .retrieveItemsQty(items.keySet()).collectList())
                .zipWhen((tuple) -> reduceItemQty(tuple.getT2(), tuple.getT1(), itemId))
                .flatMap((response) -> {
                    return Mono.just(itemId);
                });
    }

我尝试了如下所示的 switchIfEmpty 和 defaultIfEmpty。

return itemRepository.findByd(itemId).collectList()
                    .switchIfEmpty(). /// Looks like the return statement is not allowed here.
                    .zipWhen((items) -> Mono.just(items.stream()
                            .collect(Collectors.toMap(ItemQty::getId, ItemQty::getQty))))

如果您想保持当前流量,最简单的方法是使用 filter

return itemRepository.findByd(itemId)
   .collectList()
   .filter(items -> !items.isEmpty())
   ...

但我建议简化流程以使其更具可读性,并且不要在您真正不需要它们的地方过度使用反应性运算符。例如,

return itemRepository.findByd(itemId)
    .collectList()
    .flatMap(items -> {
        if (items.isEmpty()) {
            return Mono.empty();
        }

        Map<Long, Integer> itemMap = items.stream()
                .collect(Collectors.toMap(ItemQty::getId, ItemQty::getQty));

        return retrieveItemsQty(itemMap.keySet())
                .collectList()
                .flatMap(availableQty -> reduceItemQty(availableQty, itemMap, itemId));
    })
    .then(Mono.just(itemId));

您可以进一步简化并将内部主体移动到一个单独的方法中