Barcelona
Barcelona

Reputation: 2132

Update order items based on product quantities

I have 2 classes Order & OrderItem as below

public class Order {

    private String orderId;
    private List<OrderItem> orderItems;

}

public class OrderItem {

    String productId;
    Long price;
    Integer quantity;

}

I want to implement function update orderItems based on product quantities based on this requirement: When an user update quantities of items, If given products are not found in the given order, add those items newly to the order.If given quantities are zero in the given order, delete those items from the order. Otherwise update the quantities of order items.

My algorithm for this requirement as below:

List<OrderItem> request

List<OrderItem> data

Processing on request

  • Filter any req item has qty = 0 into a Set name deletedItems
  • The rest request collection is for update & insert
  • Convert the rest req collection in to Map<productId, OrderItem>

Processing on data

  • Filter data items with deletedItems
  • The rest collection iterate to update, if productId exists in Map then update, remove that item from Map
  • Insert newly items in the rest of Map into data items
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)));
}

Does my algorithm is ok? Any suggestions for improvement? Thanks

Upvotes: 0

Views: 413

Answers (1)

divilipir
divilipir

Reputation: 960

here a simple way

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);
            }
        });
    }

Upvotes: 1

Related Questions