정리


  1. Enum 추가

    일단! 할인 타입을 Enum으로 관리했다.

    DiscountType을 만들어서 관리했으며 안에 필요한 정보들을 넣었다. (고른 번호, 유저 타입, 할인율)

    그리고 번호를 골랐을 때 DiscountType이 가지고 있는 값드과 비교하기 위해서 메서드를 만들어서 사용 → 저번에 calculator에서 연산자 매칭하는 거랑 똑같이 이용

    public static DiscountType fromChoice(int choice) {
        for (DiscountType type : values()) {
            if (type.getChoice() == choice) {
                return type;
            }
        }
        throw new IllegalArgumentException("해당되는 할인 유형이 없습니다.");
    }
    
  2. for문을 stream lambda로 바꿔야 하는데 기존 for문에서 index값을 쓰고 있음. Streamindex값을 사용할 수 없음. IntStream이라는 게 있어서 그거로 변경. (카테고리 출력하거나 메뉴 출력하는 부분)

    IntStream.range(0, menus.size())
                            .forEach(i -> System.out.println((i + 1) + ". " + menus.get(i).getCategory()));
    

    .range

    .rangeClosed

장바구니에 담긴 것들 중 SmokeShack이 있으면 제외하고 출력해서 총 가격 출력하는 부분은

// for문 사용시
double total = 0;
for (CartItem item : shoppingCart) {
    System.out.println(item.toString());
    total += item.getTotalPrice();
}

// Stream 사용
// 근데 여기서 SmokeShack 값만 빼고 싶다면?? .filter()이용해서.
double total = shoppingCart.stream()
        .filter(item -> !item.getMenuItem().getName().equals("SmokeShack"))
        .peek(item -> System.out.println(item))
        .mapToDouble(item -> item.getTotalPrice())
        .sum();

이렇게 처리했다.

.peek() → 자바 스트림에서 중간 단계에서 값들을 볼 수 있게 사용하는 메서드로 로깅, 디버깅, 출력용으로 많이 사용된다. 지금은 출력을 보여줘야 하기 때문에 작성.

.mapToDouble() → 바로 sum()을 사용하니까 에러. 이건 double 타입으로 변환해주는 중간 연산자인데 sum()이 IntStream, LongStream, DoubleStream에서만 사용할 수 있다고 함. 그래서 Stream<CartItem>이나 Stream<Double>에서는 쓸 수 없기 때문에 변환해 줘야 함. 세트처럼 사용!

.sum() → 합계 구하기

.stream()과 Stream.of 차이

  1. .stream()은 컬렉션 인스턴스에서 스트림을 만들 때 사용한다.

    List<String> list = List.of("a", "b", "c");
    
    list.stream();// ← 스트림 생성 (Stream<String>)
    
  2. Stream.of

    Stream.of("a", "b", "c");     // 요소로부터 스트림 생성
    Stream.empty();              // 빈 스트림 생성
    Stream.concat(stream1, stream2);  // 두 스트림 연결
    

    컬렉션이 없어도 스트림 생성 가능

그래서! 리스트로 되어 있지 않은 애들은은 IntStream.range()하고 쓰거나 Stream.of로 바꿔서 사용했다. Enum을 가지고 와서 사용할 때 Stream.of로 해서 사용했는데 그 이유는 EnumListCollection이 아니기 때문에 .stream()을 사용할 수 없기 때문이다.

Stream.of를 사용해서 배열이나 개별요소를 스트림으로 변환시켜준다.