본문 바로가기
개인 프로젝트/kiosk-project

기존 코드에 Stream 반영하기 <5>

by pon9 2024. 11. 25.

?????

예??????

 

아놔.. 까먹고 조회할 때 스트림 안썼다;;

그래도 로직은 다 있으니까 바꾸는건 쉽... 쉬..

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 기능도 덜 구현되어 있으니 하는 김에 마저 구현해보자.

addSide 메서드 (main과 동일 로직)

.filter : 입력된 값과 type이 같은 요소가 있는지 찾는다.

조건에 맞는 객체가 존재하면 (findfirst, ifpresentofelse) : 최대 주문 가능 수량을 초과했는지 찾고 수량을 하나 올린다.

조건에 맞는 객체가 존재하지 않으면 (findfirst, ifpresentofelse) : factory를 통해 새로운 type을 생성한다.

 

deleteSide 메서드

입력받은 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