Enum 추가
일단! 할인 타입을 Enum으로 관리했다.
DiscountType을 만들어서 관리했으며 안에 필요한 정보들을 넣었다. (고른 번호, 유저 타입, 할인율)
그리고 번호를 골랐을 때 DiscountType이 가지고 있는 값드과 비교하기 위해서 메서드를 만들어서 사용 → 저번에 calculator에서 연산자 매칭하는 거랑 똑같이 이용
public static DiscountType fromChoice(int choice) {
for (DiscountType type : values()) {
if (type.getChoice() == choice) {
return type;
}
}
throw new IllegalArgumentException("해당되는 할인 유형이 없습니다.");
}
for문을 stream lambda로 바꿔야 하는데 기존 for문에서 index값을 쓰고 있음. Stream은 index값을 사용할 수 없음. IntStream이라는 게 있어서 그거로 변경. (카테고리 출력하거나 메뉴 출력하는 부분)
IntStream.range(0, menus.size())
.forEach(i -> System.out.println((i + 1) + ". " + menus.get(i).getCategory()));
.range
.rangeClosed
range 와 rangeClosed 메소드는 주어진 범위 내 순차적인 정수 스트림을 반환range는 마지막 정수를 포함하지 않는 반면, rageClosed는 마지막 정수를 포함장바구니에 담긴 것들 중 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()은 컬렉션 인스턴스에서 스트림을 만들 때 사용한다.
List<String> list = List.of("a", "b", "c");
list.stream();// ← 스트림 생성 (Stream<String>)
Stream.of
Stream.of("a", "b", "c"); // 요소로부터 스트림 생성
Stream.empty(); // 빈 스트림 생성
Stream.concat(stream1, stream2); // 두 스트림 연결
컬렉션이 없어도 스트림 생성 가능
그래서! 리스트로 되어 있지 않은 애들은은 IntStream.range()하고 쓰거나 Stream.of로 바꿔서 사용했다. Enum을 가지고 와서 사용할 때 Stream.of로 해서 사용했는데 그 이유는 Enum은 List나 Collection이 아니기 때문에 .stream()을 사용할 수 없기 때문이다.
Stream.of를 사용해서 배열이나 개별요소를 스트림으로 변환시켜준다.