[Beyond SW] 20251104

이경민·2025년 11월 5일

한화시스템 Beyond SW

목록 보기
25/40

스트림(Stream)

컬렉션에 저장된 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 기능.
람다식과 함께 사용할 수 있으며 컬렉션에 들어있는 데이터에 대한 처리를 간결하게 표현 가능.
내부 반복자를 사용하기 때문에 병렬처리가 쉬움.
1. 스트림은 원본을 변경하지 않는 읽기 전용.
2. 스트림은 iterator 처럼 한번만 사용되고 사라짐. 필요하면 다시 스트림을 생성해야함.
3. 최종 연산 전까지 중간 연산이 처리되지 않음.
4. 병렬 처리가 용이.

  1. 생성 : 스트림 생성

배열, 컬렉션 -> 스트림 생성 -> 매핑 -> 필터링 -> 결과

  1. 가공 : 원하는 결과를 만들기 위한 필터링, 매핑 등의 작업
  2. 결과 : 최종 결과를 만들어 내는 작업

스트림은 1회용으로만 사용할 수 있다.
최종연산(ex.forEach)등이 수행된 스트림은 재사용할 수 없다. 재사용하면 java.lang.IllegalStateException이 발생한다.


자바 스트림의 연산은 크게 중간 연산최종 연산으로 나눌 수 있습니다. 각각의 기능을 하나씩 쉽게 설명합니다.[1][2][5][8]


중간 연산

1. map()

  • 각 요소를 지정한 함수대로 변환해서 새로운 스트림을 만듭니다.[2][10][1]
  • 예시: 모든 문자열을 대문자로 바꾸기
    Stream<String> stream = Stream.of("a", "b");
    Stream<String> mapped = stream.map(str -> str.toUpperCase()); // A, B

2. filter()

  • 주어진 조건을 만족하는 요소만 남겨서 새로운 스트림을 만듭니다.[5][1][2]
  • 예시: "A"로 시작하는 요소만 남기기
    Stream<String> stream = Stream.of("Apple", "Banana");
    Stream<String> filtered = stream.filter(str -> str.startsWith("A")); // Apple

3. flatMap()

  • 각 요소를 스트림으로 바꾼 뒤, 모든 스트림을 하나로 합쳐서 평탄화(Flatten)합니다. 리스트, 배열의 내부 값을 한 스트림으로 펼칠 때 주로 씁니다.[1][2][5]
  • 예시: 이중 리스트 평탄화
    List<List<String>> lists = Arrays.asList(
        Arrays.asList("a", "b"),
        Arrays.asList("c", "d")
    );
    Stream<String> flatMapped = lists.stream().flatMap(List::stream); // a, b, c, d

최종 연산

1. collect()

  • 스트림의 결과를 리스트, 집합, 맵 등 컬렉션으로 모읍니다.
  • 예시: 문자열을 리스트로 수집하기
    List<String> result = stream.collect(Collectors.toList());

2. forEach()

  • 스트림의 모든 요소에 대해 작업을 수행합니다(출력 등).
  • 예시: 모든 요소 출력하기
    stream.forEach(System.out::println);

3. reduce()

  • 모든 요소를 하나의 결과로 합칩니다(누적 덧셈, 곱셈, 연결 등).
  • 예시: 모든 수 합치기
    int sum = Stream.of(1, 2, 3).reduce(0, Integer::sum); // 6

각 연산이 어떤 역할을 하는지 감이 올 거예요. 중간 연산(map, filter, flatMap)은 새로운 스트림을 만들어 이어 붙이고, 최종 연산(collect, forEach, reduce)은 실제 값을 만들거나 스트림을 끝냅니다.

age -> System.out.println(age) 이거의 축소판 = System.out::println

0개의 댓글