1. ProductDetailV2DTO
@Data
public class ProductDetailV2DTO {
private int productId;
private String productName;
private List<ProductOptionDTO> options;
public ProductDetailV2DTO(List<ProductOption> options) {
this.productId = options.get(0).getProduct().getId();
this.productName = options.get(0).getProduct().getName();
this.options = new ArrayList<>();
// for (ProductOption option : options) {
// this.options.add(new ProductOptionDTO(option));
// }
this.options = options.stream().map(ProductOptionDTO::new).toList();
}
@Data
private class ProductOptionDTO {
private int id;
private String name;
private int price;
private int qty;
public ProductOptionDTO(ProductOption option) {
this.id = option.getId();
this.name = option.getName();
this.price = option.getPrice();
this.qty = option.getQty();
}
}
}
ProductDetailV2DTO
생성자 안에서options
리스트의 초기화를for
문에서Stream API
의map
연산자를 사용하여 간결하게 변경했다.
2. OrderDetailV2DTO
@Data
public class OrderDetailV2DTO {
private int orderId;
private List<OrderProductDTO> products;
private int sumPrice;
public OrderDetailV2DTO(List<OrderOption> options) {
this.orderId = options.get(0).getOrder().getId();
// for (OrderOption option : options) {
// this.sumPrice += option.getTotalPrice();
// }
this.sumPrice = options.stream().mapToInt(OrderOption::getTotalPrice).sum();
// Set<Integer> ids = new HashSet<>();
// for (OrderOption option : options) {
// ids.add(option.getProduct().getId());
// }
// for (Integer id : ids) {
// List<OrderOption> temp = new ArrayList<>();
// for (OrderOption option : options) {
// if(id == option.getProduct().getId()) temp.add(option);
// }
// OrderProductDTO product = new OrderProductDTO(temp);
// products.add(product);
// }
this.products = new ArrayList<>();
options.stream().collect(Collectors.groupingBy(o -> o.getProduct().getId())).values().forEach(v -> products.add(new OrderProductDTO(v)));
}
@Data
private class OrderProductDTO {
private int productId;
private List<OrderOptionDTO> options;
public OrderProductDTO(List<OrderOption> options) {
this.productId = options.get(0).getProduct().getId();
// for (OrderOption option : options) {
// this.options.add(new OrderOptionDTO(option));
// }
this.options = options.stream().map(OrderOptionDTO::new).toList();
}
@Data
private class OrderOptionDTO {
private int id;
private String optionName;
private int qty;
private int totalPrice;
public OrderOptionDTO(OrderOption option) {
this.id = option.getId();
this.optionName = option.getOptionName();
this.qty = option.getQty();
this.totalPrice = option.getTotalPrice();
}
}
}
}
sumPrice
는Stream API
의sum
연산자를 활용하여 합을 구했다.
products
는Stream API
의collect
연산자와groupingBy
를 사용하여 필요한id
별로 그룹화하고,forEach
를 사용해OrderProductDTO
를 추가했다.
OrderProductDTO
에서는map
연산자를 사용하여options
를 초기화했다.
Share article