根据产品数量更新订单项目

时间:2021-07-02 15:48:45

标签: java

我有 2 个类 Order & OrderItem 如下

public class Order {

    private String orderId;
    private List<OrderItem> orderItems;

}

public class OrderItem {

    String productId;
    Long price;
    Integer quantity;

}

我想根据这个要求实现基于产品数量的功能更新订单项目:当用户更新项目数量时,如果在给定订单中找不到给定产品,则将这些项目新添加到订单中。如果给定数量是零在给定的顺序,从订单中删除这些项目。否则更新订单商品的数量。

我对此要求的算法如下:

List<OrderItem> request

List<OrderItem> data
<块引用>

按要求处理

  • 将 qty = 0 的任何请求项过滤为 Set 名称已删除项
  • 其余请求集合用于更新和插入
  • 将剩余的 req 集合转换为 Map

数据处理

  • 使用已删除的项目过滤数据项
  • 其余集合迭代更新,如果map中存在productId则更新,从Map中删除该项目
  • 将 Map 其余部分中的新项插入数据项
void updateItems(List<OrderItem> request, List<OrderItem> data) {
    Set<String> deletedItems = new HashSet();
    Map<String, OrderItem> reqItems = request.stream()
            .map(x -> {
                if(x.getQuantity() == 0) {
                    deletedItems.add(x.getProductId());
                }
                return x;
            })
            .filter(x -> x.getQuantity() > 0)
            .collect(Collectors.toMap(OrderItem :: getProductId, x -> x));

    data.stream()
            .filter(x -> !deletedItems.contains(x.getProductId()))
            .map(x -> {
                String productId = x.getProductId();
                if(reqItems.containsKey(productId)) {
                    x.setQuantity(reqItems.get(productId).getQuantity());
                    reqItems.remove(productId);
                };
                return x;
            })
            .collect(Collectors.toList());
    
    reqItems.entrySet().stream()
            .forEach(x -> data.add(new OrderItem(x)));
}

我的算法可以吗?有什么改进建议吗?谢谢

1 个答案:

答案 0 :(得分:1)

这里有一个简单的方法

void updateItems(List<OrderItem> request, List<OrderItem> data) {
        request.forEach(r -> {
            final Optional<OrderItem> exitsOrder = data.stream().filter(d -> d.getProductId().equalsIgnoreCase(r.getProductId())).findFirst();
            if (exitsOrder.isPresent()) {
                if (r.getQuantity() == 0) {
                    data.remove(exitsOrder.get());
                } else {
                    exitsOrder.get().setQuantity(r.getQuantity());
                }
            } else {
                data.add(r);
            }
        });
    }