Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 인텔리제이
- 백준
- 내일배움캠프
- 키오스크
- EC2
- 스프링예외처리
- o'auth2
- mysqlworkbench
- 자바
- Infra
- css
- JWT
- 스프링시큐리티
- 스프링
- 도커
- 알고리즘
- 깃허브
- 스파르타코딩클럽
- java
- 연동
- tomcat
- 스파르타
- 테스트코드
- AWS
- 소셜로그인
- 프로메테우스
- Intellij
- MySQL
- 오버라이딩
- 그라파나
Archives
- Today
- Total
개발스토리지😃
[Java] Stream 메서드 본문
Stream은 컬렉션(리스트, 배열 등)을 함수형 스타일로 처리하는 기능을 제공
1. Stream 다이어그램
- BaseStream(기본적 스트림 기능 정의)을 상속하는 인터페이스
- Collection 인터페이스에 기본적으로 포함되어 있어서 별도의 Stream import 없이도 사용 가능
- 기본형을 다룰때는 IntStream, LongStream, DoubleStream 사용
2. Stream 특징
- 데이터 소스를 변경하지 않음 → 기존 리스트를 수정하지 않고 새로운 결과 생성
- 중간 연산(Intermediate)과 최종 연산(Terminal)으로 나뉨
- 지연 연산(Lazy Evaluation) → 필요할 때만 실행되므로 성능 최적화 가능
- 병렬 처리 지원 (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 |