Header Ads Widget

Responsive Advertisement

[Java] 2장. 스트림(Stream) 기본

2장 스트림(Stream) 기본

📚 2장. 스트림(Stream) 기본

💡 스트림이란?

스트림(Stream)은 데이터의 흐름을 추상화한 개념입니다.

컬렉션(리스트, 배열 등) 데이터를 선언형으로 처리할 수 있게 도와줍니다.

스트림 특징

  • 원본 데이터를 변경하지 않는다
  • 필터링, 매핑, 정렬 등 다양한 연산 가능
  • 중간 연산과 최종 연산으로 구성된다

📝 예제: 스트림 기본 사용

코드

List<String> fruits = Arrays.asList("apple", "banana", "cherry");
fruits.stream()
      .filter(fruit -> fruit.startsWith("b"))
      .forEach(System.out::println);

실행 결과

banana

코드 분석

코드 라인 설명
fruits.stream() 리스트를 스트림으로 변환
filter(fruit -> fruit.startsWith("b")) 'b'로 시작하는 과일만 필터링
forEach(System.out::println) 필터링된 과일을 하나씩 출력

🛠️ .stream() 다음에 바로 사용할 수 있는 주요 메서드

메서드 설명 유형
filter() 조건에 맞는 데이터만 남긴다 중간 연산
map() 데이터를 변환한다 중간 연산
sorted() 데이터를 정렬한다 중간 연산
distinct() 중복을 제거한다 중간 연산
limit() 일부 데이터만 가져온다 중간 연산
skip() 일부 데이터를 건너뛴다 중간 연산
forEach() 각 데이터에 대해 작업을 수행한다 최종 연산
collect() 결과를 수집한다 최종 연산
count() 요소 수를 센다 최종 연산

🚀 스트림 전체 흐름 정리

stream()
➔ 데이터를 스트림으로 만들고

중간 연산 (filter, map, sorted, distinct, limit, skip)
➔ 데이터를 변형하거나 가공하고

최종 연산 (forEach, collect, count)
➔ 데이터를 사용하거나 모은다

💡 추가로 기억할 점

  • 모든 중간 연산은 지연(Lazy) ➔ 최종 연산을 만나야 실행된다!

🔎 .forEach()는 어디에 적용될까?

✅ .forEach()는 스트림의 결과(남아있는 요소들)에 적용된다.

  • .filter()를 통과한 데이터들 ➔
  • .forEach()가 하나씩 가져다가 작업한다!

🔎 .filter()가 리스트 전체를 다 돈 다음 .forEach()를 실행하는 걸까?

정확히는 아니다.

  • 스트림은 "하나씩(hungry model)", "지연(lazy)" 하게 처리된다.
  • 최종 연산 (forEach)을 만나야 진짜 실행된다.

실제 흐름:

  • stream() ➔ 준비만 함
  • filter() ➔ 조건 저장
  • forEach() ➔ 실행되면서 요소를 하나씩 처리

🎯 초간단 요약

부분 설명
fruit 네가 직접 정한 변수명 (스트림 요소 하나)
filter(fruit -> fruit.startsWith("b")) 요소 하나하나 검사해서 true인 것만 통과
forEach(System.out::println) 통과한 요소 하나하나를 출력
전체 흐름 하나 꺼내 ➔ 필터 ➔ 출력 ➔ 반복

📦 코드 흐름 다시 정리

List<String> fruits = Arrays.asList("apple", "banana", "cherry", "blueberry");

fruits.stream()
  .filter(fruit -> fruit.startsWith("b"))
  .forEach(System.out::println);

🧠 심화 개념: 스트림 특징

특성 설명
지연 실행 (Lazy) 중간 연산은 최종 연산이 있어야 실행된다.
요소 단위 처리 하나씩 꺼내서 처리 후 다음 요소 진행
메모리 절약 리스트 전체를 저장하지 않고 흐름에 따라 처리

✅ 결론

  • .stream() ➔ 준비만 한다
  • .filter() ➔ 조건 저장
  • .forEach() ➔ 하나씩 꺼내 필터하고 출력!





댓글 쓰기

0 댓글