프로젝트/키오스크

[키오스크 프로젝트] 스트림 사용기

yoney 2025. 1. 16. 20:51

이번 프로젝트에서 사용한 스트림과 람다의 구현 요구사항은 다음과 같다.

 

  • 기존에 생성한 Menu의 MenuItem을 조회 할 때 스트림을 사용하여 출력하도록 수정
  • 기존 장바구니에서 특정 메뉴 빼기 기능을 통한 스트림 활용

⌛️첫번째 요구사항에 stream 적용

//리스트 안에 있는 MenuItem 하나씩 출력
for (int i = 0; i < menuItems.size(); i++) {
    System.out.println(i + 1 + ". " + menuItems.get(i));
}

기존에 구현했던 코드는 다음과 같다.

 

Stream을 사용하기 위해 했던 생각

❔ 그냥 리스트에 있는 내용물을 하나씩 보여주면 되니까 menuItems.forEach(System.out::println)를 쓰면 되지 않을까?

👉🏼 이게 stream을 사용한 건지도 모르겠다 근데 제일 큰 문제는 인덱스 번호가 같이 출력되어야 하는데 저렇게 하면 앞에 숫자는 출력이 안돼서 쓸 수 없는 코드였다.

 

❔ 그러면 앞에 인덱스 번호를 같이 띄울려면 어떻게 해야하지?

❔ 일단 모든 아이템들을 다 가져와야하니까 map()을 써야하나? 그래도 인덱스 번호는 어떻게 띄우지 자동으로 increment되도록 하는 메소드가 있나? 싶어서 찾아본 결과

👉🏼 IntStream.range()를 사용하면 되는 것이었다.

 IntStream.range(0, menuItems.size()): 0부터 menuItems.size() - 1 까지의 정수를 생성한다.

그러면 이제 그걸 forEach로 출력해주면 끗

//리스트 안에 있는 MenuItem 하나씩 출력 Stream 사용
IntStream.range(0,menuItems.size()).forEach(i -> System.out.println(i+1+". "+menuItems.get(i)));

 


⌛️두번째 요구사항에 stream 적용

Stream을 사용하기 위해 했던 생각

 

❔  리스트에 있는 것 중에서 특정 이름의 아이템은 빼야하니까 filter를 써야하지 않을까?

❔  그리고 빼고 나서 다시 리스트 형태로 돌려놔야 하니까 collect(Collectors.toList())를 사용하자

👉🏼 빼려고 하는 특정 이름이랑 이름이 일치하지 않는 아이템들만 filtering해서 리스트로 묶으면 되겠다

cartList = cartList.stream()
        .filter(item ->!"슈슈버거".equals(item.getFoodName()))
        .collect(Collectors.toList());

notEquals나 isNotEquals같은 메소드가 있을 줄 알고 찾아봤는데 없어서 부정연산자를 사용했다ㅎㅎ