
List<String> names = List.of("kim", "lee", "park");
names.strea() // stream 생성
.filter(name -> name.startsWith("k")) // 중간 연산
.map(String::toUpperCase) // 중간 연산
.forEach(System.out::println); // 최종 연산
| 분류 | 메서드 | 설명 |
|---|---|---|
| 📌 생성 | stream(), Stream.of(...) | 컬렉션 또는 배열로부터 스트림 생성 |
| 📌 필터링 | filter() | 조건을 만족하는 요소만 통과 |
| 📌 변환 | map() | 요소를 다른 값으로 변환 |
| 📌 정렬 | sorted() | 기본 정렬 / 커스텀 정렬 |
| 📌 제한 | limit(n), skip(n) | 앞에서 n개 제한 / n개 건너뛰기 |
| 📌 수집 | collect() | 결과를 리스트, 맵 등으로 수집 |
| 📌 반복 | forEach() | 각각의 요소에 작업 수행 |
| 📌 검사 | anyMatch(), allMatch(), noneMatch() | 조건 검사 |
| 📌 검색 | findFirst(), findAny() | 요소 하나 찾기 (Optional 반환) |
| 📌 통계 | count(), max(), min(), sum() | 숫자형 요소의 통계 계산 |
🔹 필터 + 변환 + 출력
List<String> list = List.of("apple", "banana", "avocado");
list.sream()
.filter(s -> s.startsWith("a"))
.map(String::toUppercase)
.forEach(System.out::println);
출력:
APPLE
AVOCADO
🔹 정렬
list.stream()
.sorted() // 오름차순
.forEach(System.out::println);
list.stream()
.sorted(Comparator.reverseOrder()) // 내림차순
.forEach(System.out::println);
🔹 수집 (List로 다시 받기)
List<String> upperList = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
🔹 숫자형 리스트 예: 최대값
List<Integer> nums = List.of(5, 2, 8, 3);
int max = nums.stream().max(Integer::compare).orElse(-1);
list.parallelStream()
.map(...)
.collect(...);
forEachOrdered() 사용 (단, 성능 손해 있음)list.parallelStream()
.sorted()
.forEachOrdered(System.out::println);
| 항목 | 스트림 | 일반 반복문 |
|---|---|---|
| 코드 가독성 | 좋음 (간결) | 길고 명령형 |
| 성능 | 거의 동일 / 병렬처리 가능 | 순차처리 |
| 유연성 | 연산 조합 쉬움 | 복잡함 |
| 디버깅 | 어려움 (peek 사용 가능) | 쉬움 |
.peek(System.out::println) 으로 중간 디버깅 가능Optional로 리턴되는 findFirst(), max() 등은 .orElse() 같이 쓰기Collectors.toMap() 같은 고급 수집기도 있음List<Customer> customers = List.of(
new Customer(1, "Kim"),
new Customer(2, "Lee"),
new Customer(3, "Park")
);
// ID를 key로, 이름을 value로 Map 만들기
Map<Integer, String> map = customers.stream()
.collect(Collectors.toMap(
Customer::getId, // keyMapper
Customer::getName // valueMapper
));
// 전체 객체를 Map에 저장 (id 기준)
Map<Integer, Customer> map = customers.stream()
.collect(Collectors.toMap(
Customer::getId,
Function.identity()
));
// 중복 키가 있을 경우? → mergeFunction 필요
Map<Integer, Customer> map = customers.stream()
.collect(Collectors.toMap(
Customer::getid,
Customer::getName,
(name1, name2) -> name1 + "/" + name2 // 충돌 해결
));
```