响应式编程 - Return 结果为空时响应
Reactive programming - Return response when the result is empty
我下面有一个响应式代码,它执行以下操作。
- 按 ID 查询项目 table - (itemRepository.findByd(itemId))
- 根据步骤 1 的结果创建地图
- 从数据库调用 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));
您可以进一步简化并将内部主体移动到一个单独的方法中
我下面有一个响应式代码,它执行以下操作。
- 按 ID 查询项目 table - (itemRepository.findByd(itemId))
- 根据步骤 1 的结果创建地图
- 从数据库调用 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));
您可以进一步简化并将内部主体移动到一个单独的方法中