Reputation: 2132
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
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