❗️ Stream API 문법을 익히고, 실전에 적용하여 코드를 가독성 & 안전성을 개선한다
✅ 함수형 프로그래밍을 도입하여 컬렉션, 배열 등을 처리/조작을 간단 효율적으로 하는 API
List
, Set
등)을 for문
을 안 돌리고도 깔끔하게 다룰 수 있게 해준다.👉 핵심은 데이터를 “흐름(stream)”처럼 흘려보내면서 중간에 가공하고 최종 결과를 얻는 것이다.
for문
돌리면서 if 넣고… 하는 게 아니라, “필터링해”, “합계 구해” 처럼 무엇을 할지만 적으면 됨.for-each
로 직접 돌리지 않고, Stream이 내부에서 알아서 반복 처리해줌.List<String> list = Arrays.asList("java", "python", "c");
List<String> result = new ArrayList<>();
for (String s : list) {
if (s.length() > 3) {
result.add(s.toUpperCase());
}
}
List<String> result = list.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.toList();
.parallelStream()
을 쓰면 멀티코어 CPU를 활용해서 데이터 처리를 병렬로 실행할 수 있다.list.parallelStream()
.forEach(System.out::println);
SELECT UPPER(name) FROM list WHERE LENGTH(name) > 3;
👉 이 느낌을 Java 코드로 가져온 게 Stream이다.
List
, Set
, 배열
등에서 .stream()
호출List<String> names = Arrays.asList("정잉이", "철수", "영희");
Stream<String> stream = names.stream();
filter()
→ 조건 걸러내기map()
→ 다른 형태로 변환sorted()
→ 정렬distinct()
→ 중복 제거👉 중간 연산은 lazy (게으름) → 최종 연산이 실행돼야 동작한다!
forEach()
→ 출력collect()
→ 다시 리스트/셋으로 모으기count()
→ 통계, 개수 세기sum()
→ 합계, 평균 등 집계reduce()
→ 소모, indentity(초기값)와 연산findFirst()
→ 검색, Stream의 첫번째 값 추출import java.util.*;
import java.util.stream.*;
public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("정잉이", "철수", "영희", "철수");
// "철수" 빼고, 중복 제거해서, 대문자로 바꿔 출력
names.stream()
.filter(name -> !name.equals("철수")) // 중간 연산 (필터링)
.distinct() // 중복 제거
.map(String::toUpperCase) // 변환
.forEach(System.out::println); // 최종 연산 (출력)
}
}
정잉이
영희
// [기존 for-loop]
int[] numbers = {1, 2, 3, 4, 5};
int sum = 0;
for (int n : numbers) {
sum += n;
}
System.out.println("합계: " + sum);
// [Stream으로 개선]
import java.util.stream.*;
int[] numbers = {1, 2, 3, 4, 5};
int sum = IntStream.of(numbers).sum();
System.out.println("합계: " + sum);
지정한 요소들을 바로 스트림으로 만들어 줌.
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Stream<String> stream = Stream.of("apple", "banana", "cherry");
stream.forEach(System.out::println);
}
}
apple
banana
cherry
배열을 스트림으로 변환
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(numbers); // primitive int 배열도 가능
stream.forEach(System.out::println);
}
}
Arrays.stream(numbers, 1, 4) // index 1~3 요소만
List
,Set
같은 컬렉션 객체에서 스트림 생성
parallelStream()
을 사용하면 병렬 스트림으로 처리 가능import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry");
list.stream().forEach(System.out::println);
}
}
메서드 | 입력 | 특징 |
---|---|---|
Stream.of() | 여러 값, 배열 | 직접 값 지정 가능, 간단하게 스트림 생성 |
Arrays.stream() | 배열 | 배열 → 스트림 변환, 부분 배열 선택 가능 |
collection.stream() | List, Set 등 컬렉션 | 컬렉션 내부 데이터를 바로 스트림으로 처리 가능 |