자바에서 컬렉션(Collection) 또는 배열(Array)의 요소들을 반복적으로 처리하고, 필터링하거나 가공할 수 있게 도와주는 기능
즉, 스트림(Stream)은 컬렉션과 배열의 요소들을 함수형 방식으로 가공·처리하기 위한 도구

  • 스트림은 데이터 소스를 변경하지 않고, 가공된 결과를 반환
  • 내부 반복을 사용하여 간결하고 선언적인 코드 작성 가능
  • 중간 연산(filter, map 등)과 최종 연산(forEach, collect 등)을 통해 데이터 처리 흐름 구성

    import java.util.HashSet;
    import java.util.Set;
    import java.util.stream.Stream;
    
    public class Test2 {
    	public static void main(String[] args) {
    		Set<String> set = new HashSet<>();
    		set.add("aa");
    		set.add("bb");
    		set.add("cc");
    
    		Stream<String> stream = set.stream();
    		//람다식 ->
    		stream.forEach(name -> System.out.println(name));
    				//void a(name) {System.out.println(name);}과 같음
    				//name은 매개변수 값 임의. a든 b든 상관없음
    	}
    }
    

1. 컬렉션으로부터 스트림 얻기

  • 자바의 Collection 인터페이스를 구현한 자료구조는 .stream() 또는 .parallelStream() 메서드를 통해 스트림을 생성할 수 있다

기본 스트림 생성

List<String> list = Arrays.asList("A", "B", "C");

// 순차 스트림
Stream<String> stream = list.stream();

병렬 스트림 생성(병렬 처리)

  • 내부적으로 여러 스레드를 사용하여 데이터를 병렬로 처리
  • 속도 향상 가능하지만 상황에 따라 주의가 필요
Stream<String> parallelStream = list.parallelStream();

2. 스트림 중간 연산 ⭐️

✅ map()

  • 요소를 다른 형태로 가공해서 새로운 스트림 생성
  • 요소를 반환
List<String> names = Arrays.asList("kim", "lee", "park");

List<String> upperNames = names.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

System.out.println(upperNames);  // [KIM, LEE, PARK]

✅ filter()

  • 조건에 해당하는 요소만 남기고 필터링
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> even = numbers.stream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList());

System.out.println(even);  // [2, 4]

✅ sorted()

  • 요소를 정렬해서 스트림 반환 (기본 정렬 또는 사용자 정의 가능)
List<String> words = Arrays.asList("banana", "apple", "cherry");

List<String> sorted = words.stream()
    .sorted()
    .collect(Collectors.toList());

System.out.println(sorted);  // [apple, banana, cherry]

// 내림차순 정렬
words.stream()
    .sorted(Comparator.reverseOrder())
    .forEach(System.out::println);

✅ collect()

  • 최종 연산으로, 스트림의 결과를 리스트, 집합 등으로 수집 (결과 수집)
List<String> names = Arrays.asList("A", "B", "C");

List<String> collected = names.stream()
    .collect(Collectors.toList());

System.out.println(collected);  // [A, B, C]

utils 메서드 정리

메서드 설명
map() 요소를 다른 형태로 변환
filter() 조건에 따라 요소 걸러냄
sorted() 요소 정렬
collect() 최종 결과를 컬렉션으로 수집

3. 요소를 하나씩 처리(looping)

  • 스트림의 요소들을 하나씩 꺼내서 처리하는 연산
  • 주로 디버깅이나 최종 출력에 사용됨

✅ forEach()

  • 스트림의 최종 연산
  • 요소를 하나씩 소비하며 람다식으로 처리
  • 반환값 없음 (void)
Stream.of("A", "B", "C")
  .forEach(System.out::println);  // A B C 출력

✅ peek()

  • 중간 연산
  • 요소를 가공하지 않고 단순히 엿보기 (디버깅용으로 주로 사용)
  • 최종 연산이 실행되어야 peek()도 작동함
Stream.of("A", "B", "C")
.peek(System.out::println)
.count(); // 출력: A B C

4. 요소 기본 집계

  • 스트림의 요소들을 집계(aggregate)하는 연산
  • 결과로는 Optional, 숫자, 컬렉션 등이 반환됨

✅ Optional 클래스

  • 스트림 집계 결과가 없을 수 있는 경우를 처리하기 위한 컨테이너 클래스
  • 집계 메서드: min(), max(), findFirst(), findAny()
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> min = numbers.stream().min(Integer::compareTo);
min.ifPresent(System.out::println); // 출력: 1

정리

연산 설명 반환값
forEach() 각 요소를 하나씩 소비 void
peek() 각 요소를 가공 없이 훑어보기 Stream
min(), max() 등 요소 집계 Optional

태그:

카테고리:

업데이트:

댓글남기기