?????
예??????
아놔.. 까먹고 조회할 때 스트림 안썼다;;
그래도 로직은 다 있으니까 바꾸는건 쉽... 쉬..
public class OrderBuilder {
private final List<MainMenuItem> mainItem = new ArrayList<>();
private final List<SideMenuItem> sideItem = new ArrayList<>();
private Coupon coupon;
public boolean isEmpty() {
return mainItem.isEmpty() && sideItem.isEmpty();
}
public void addMain(MainMenuType type, int quantity, int taste){
for(MainMenuItem item : mainItem){
if(item.getType() == type && item.getTaste() == taste){
item.setQuantity(item.getQuantity() + quantity);
return;
}
}
mainItem.add(MainMenuFactory.createMainMenu(type, quantity, taste));
}
public void addSide(SideMenuType type, int quantity){
if(mainItem.isEmpty()){
throw new BadInputException("메인 메뉴 없이 주문할 수 없습니다.");
}
for(SideMenuItem item : sideItem){
if(item.getType() == type){
if(quantity > type.getMaxQuantity()){
throw new BadInputException("최대 주문 가능 수량을 초과했습니다.");
}
item.setQuantity(item.getQuantity() + quantity);
return;
}
}
sideItem.add(SideMenuFactory.createSideMenu(type, quantity));
}
public void deleteMenu(){
System.out.println("\n\n삭제할 메뉴를 골라주세요:\n");
for(MainMenuItem item : mainItem){
item.displayMain();
}
for(SideMenuItem item : sideItem){
item.displaySide();
}
String deleteInput = new java.util.Scanner(System.in).nextLine();
int deleteChoice = Integer.parseInt(deleteInput);
}
public void clearMenu(){
mainItem.clear();
sideItem.clear();
coupon = null;
}
public void setCoupon(Coupon coupon){
this.coupon = coupon;
}
public boolean isCouponEmpty(){
return coupon == null;
}
public double totalPrice(){
return mainItem.stream().mapToDouble(MainMenuItem::getTotalPrice).sum()
+ sideItem.stream().mapToDouble(SideMenuItem::getTotalPrice).sum();
}
public double couponPrice(){
if(coupon == null) return totalPrice();
return coupon.applyCoupon(totalPrice());
}
public void displayBuilder(){
for(MainMenuItem item : mainItem){
item.displayMain();
}
for(SideMenuItem item : sideItem){
item.displaySide();
}
if(coupon == null){
System.out.println("총 금액: W" + String.format("%.2f", totalPrice()));
}else{
System.out.println(coupon.getCouponName() + "을 적용한 총 금액: W" + String.format("%.2f", couponPrice()));
}
}
public Order build(){
String finalPrice = String.format("%.2f", couponPrice());
return new Order(new ArrayList<>(mainItem), new ArrayList<>(sideItem), finalPrice);
}
}
기존의 orderbuilder 코드다. 값을 계산할 때만 stream을 쓰고 있었다. 아직 stream보다 for + if 조합이 더 손에 익어서 이렇게 해버렸다.
for루프를 돌리던 곳에 stream을 사용할 수 있다. filter을 통해 if문도 줄일 수 있다.
delete 기능도 덜 구현되어 있으니 하는 김에 마저 구현해보자.
.filter : 입력된 값과 type이 같은 요소가 있는지 찾는다.
조건에 맞는 객체가 존재하면 (findfirst, ifpresentofelse) : 최대 주문 가능 수량을 초과했는지 찾고 수량을 하나 올린다.
조건에 맞는 객체가 존재하지 않으면 (findfirst, ifpresentofelse) : factory를 통해 새로운 type을 생성한다.
입력받은 name 이 기존에 있던 type과 같으면 제거한다.
delete 메서드에 사용되는 findname 메서드다. name을 입력받고 이곳에서 예외처리를 하기 때문에 delete에서는 별다른 예외처리가 필요없다.
근데 이것도 stream으로 바꿀 수 있어서 바꿨다. 흠..
정상작동 한다 ㅎ
'개인 프로젝트 > kiosk-project' 카테고리의 다른 글
Trouble shooting <4> (0) | 2024.11.25 |
---|---|
Builder pattern<3> (1) | 2024.11.24 |
State pattern <2> (0) | 2024.11.24 |