개발스토리지😃

[Java] Stream 메서드 본문

언어/자바

[Java] Stream 메서드

believekim 2025. 3. 27. 14:54

 

Stream은 컬렉션(리스트, 배열 등)을 함수형 스타일로 처리하는 기능을 제공

 

 

1. Stream 다이어그램

  • BaseStream(기본적 스트림 기능 정의)을 상속하는 인터페이스
  • Collection 인터페이스에 기본적으로 포함되어 있어서 별도의 Stream import 없이도 사용 가능
  • 기본형을 다룰때는 IntStream, LongStream, DoubleStream 사용


 

 

2. Stream 특징

  1. 데이터 소스를 변경하지 않음 → 기존 리스트를 수정하지 않고 새로운 결과 생성
  2. 중간 연산(Intermediate)과 최종 연산(Terminal)으로 나뉨
  3. 지연 연산(Lazy Evaluation) → 필요할 때만 실행되므로 성능 최적화 가능
  4. 병렬 처리 지원 (parallelStream()) → 멀티코어 활용 가능

 

3. 중간 연산(Intermediate) 메서드

중간 연산(Intermediate) 설명
filter(Predicate<T>) 조건에 맞는 요소만 필터링
map(Function<T, R>) 요소 변환 (ex: String → Integer)
flatMap(Function<T, Stream<R>>) 중첩된 구조를 평평하게 변환 (List<List<T>> → List<T>)
distinct() 중복 제거
sorted() 정렬 (오름차순)
sorted(Comparator<T>) 정렬 (사용자 정의)
peek(Consumer<T>) 디버깅용 (각 요소를 중간에 출력)
limit(long n) 앞에서 n개만 선택
skip(long n) 앞에서 n개 제외

4. 최종 연산(Terminal) 메서드

최종 연산 (Terminal) 설명
forEach(Consumer<T>) 각 요소에 대해 동작 수행
toArray() Stream을 배열로 변환
collect(Collector<T, A, R>) 리스트, 맵 등 컬렉션으로 변환
count() 요소 개수 반환
reduce(BinaryOperator<T>) 모든 요소를 하나로 합침 (누적 연산)
anyMatch(Predicate<T>) 조건을 만족하는 요소가 하나라도 있으면 true
allMatch(Predicate<T>) 모든 요소가 조건을 만족하면 true
noneMatch(Predicate<T>) 모든 요소가 조건을 만족하지 않으면 true
findFirst() 첫 번째 요소 반환 (Optional)
findAny() 아무 요소나 반환 (Optional, 병렬처리 시 유용)
min(Comparator<T>) 최소값 반환 (Optional)
max(Comparator<T>) 최대값 반환 (Optional)

 

 

5. Stream 주요 메서드 사용 예시

  • filter() - 조건에 맞는 요소만 필터링
List<String> names = List.of("Alice", "Bob", "Charlie", "David");

// 'A'로 시작하는 이름만 필터링
List<String> filteredNames = names.stream()
             .filter(name -> name.startsWith("A"))
             .collect(Collectors.toList());
             
System.out.println(filteredNames); // 출력: [Alice]

 

 

  • map() - 요소 변환
List<String> names = List.of("Alice", "Bob", "Charlie");

// 모든 이름을 대문자로 변환
List<String> upperCaseNames = names.stream()
             .map(String::toUpperCase)
             .collect(Collectors.toList());

System.out.println(upperCaseNames); // 출력: [ALICE, BOB, CHARLIE]

 

 

  • sorted() - 정렬
List<Integer> numbers = List.of(5, 3, 8, 1);

// 오름차순 정렬
List<Integer> sortedNumbers = numbers.stream()
              .sorted()
              .collect(Collectors.toList());

System.out.println(sortedNumbers); // 출력: [1, 3, 5, 8]

 

 

  • reduce() - 누적 연산
List<Integer> numbers = List.of(1, 2, 3, 4, 5);

// 모든 숫자의 합 계산
int sum = numbers.stream()
          .reduce(0, Integer::sum);

System.out.println(sum); // 출력: 15

 

 

  • collect(Collectors.toList()) - 리스트로 변환
List<String> words = List.of("apple", "banana", "cherry");

// 길이가 5 이상인 단어만 리스트로 변환
List<String> filteredWords = words.stream()
             .filter(word -> word.length() >= 6)
             .collect(Collectors.toList());

System.out.println(filteredWords); // 출력: [banana, cherry]

 

 

  • anyMatch() / allMatch() / noneMatch() - 조건 검사
List<Integer> numbers = List.of(2, 4, 6, 8, 10);

boolean anyOdd = numbers.stream().anyMatch(n -> n % 2 != 0);
boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0);
boolean noneNegative = numbers.stream().noneMatch(n -> n < 0);

System.out.println("홀수가 포함되어 있는가? " + anyOdd); // false
System.out.println("모든 숫자가 짝수인가? " + allEven); // true
System.out.println("음수가 없는가? " + noneNegative); // true

 

 

'언어 > 자바' 카테고리의 다른 글

[Java] Optional<T> 메서드  (0) 2025.04.01
[Java] Builder 패턴  (0) 2025.03.31
[Java] Stack 메서드  (0) 2025.03.24
[Java] Map 메서드  (0) 2025.03.21
[Java] Set 메서드  (0) 2025.03.20