[키오스크 프로젝트] 스트림 사용기
이번 프로젝트에서 사용한 스트림과 람다의 구현 요구사항은 다음과 같다.
- 기존에 생성한 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같은 메소드가 있을 줄 알고 찾아봤는데 없어서 부정연산자를 사용했다ㅎㅎ