stream : APP이 OS로 흐르는 흐름
- 자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룹니다.
- 스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.
- 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 합니다

stream API
흐름

1. 던진다(스트림의 생성 - Creation)
스트림은 컬렉션, 배열, I/O 채널 등에서 생성할 수 있다. 일반적으로 Collection 인터페이스의 stream() 메서드를 사용하여 스트림을 생성합니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie","David","anna");
List<String> r1 = names.stream();2. 가공한다(중간 연산 - 스트림의 변환)
중간 연산은 스트림을 변형하거나 필터링하는 작업을 수행한다. 여러 개의 중간 연산을 연결할 수 있다. (원래 가공하려면 임시 데이터 공간을 만들어야하지만 stream 임시 데이터 공간이 필요없다)
주요 중간 연산
메서드 | 설명 | 예시 |
filter() | 조건에 맞는 요소만 필터링
( 1. 삭제 2. 검색) | stream.filter(s -> s.length() > 5) |
map() | 각 요소를 다른 값으로 매핑(가공) | stream.map(s -> s.toUpperCase()) |
flatMap() | 중첩된 스트림을 평면화 | stream.flatMap(Collection::stream) |
sorted() | 요소 정렬 | stream.sorted() |
distinct() | 중복 제거 | stream.distinct() |
limit() | 요소 개수 제한 | stream.limit(3) |
skip() | 처음 N개 요소 건너뛰기 | stream.skip(2) |
//Map<Character, List<String>>을 var로 작성해도 된다
//Map<Character, List<String>> groupData = names.stream()
.map(name -> name.toUpperCase())
.collect(Collectors.groupingBy(s -> s.charAt(0)));
.filter(name -> name.length() > 3)
// . toList(); 3. 수집한다( 최종연산 - 스트림의 사용)
최종 연산은 스트림의 결과를 생성하고, 스트림 처리 과정을 종료한다. 스트림을 소비하여 결과를 반환.
주요 최종 연산
메서드 | 설명 | 예시 |
forEach() | 각 요소에 대해 작업 수행 | stream.forEach(System.out::println) |
collect() | 결과를 컬렉션으로 변환 | stream.collect(Collectors.toList()) → stream.toList() 으로 줄일 수 있다 |
count() | 요소 개수 반환 | long count = stream.count() |
reduce() | 누적된 결과를 반환 | stream.reduce(0, Integer::sum) |
toArray() | 스트림 요소를 배열로 반환 | Object[] array = stream.toArray() |
findFirst() | 첫 번째 요소 반환 | Optional<String> first = stream.findFirst() |
anyMatch() | 조건에 만족하는 요소가 하나라도 있는지 확인 | boolean match = stream.anyMatch(s -> s.startsWith("a")) |
//List<String> newNames = names.stream()
// .map(name -> name.toLowerCase())
// .filter(name -> name.length() > 3)
.toList();
StreamAPI을 사용할 수 있는 형식
- 컬렉션 - stream() 메서드를 사용하여 스트림으로 변환. : List: ArrayList, LinkedList 등 Set: HashSet, TreeSet 등 Queue: LinkedList, PriorityQueue 등
- 배열 - Arrays.stream(array) 메서드를 사용하여 스트림으로 변환.
- 파일 - Files.lines(Path path)를 사용하여 파일의 각 줄을 스트림으로 읽을 수 있다.
- 정수 범위 - IntStream.range(int startInclusive, int endExclusive)와 같은 메서드를 사용하여 특정 범위의 정수로 스트림을 생성할 수 있다.
- Stream.of(): Stream.of(T... values)를 사용하여 여러 개의 값을 직접 스트림으로 만들 수 있다.
Stream정리
list를 스트림에 던지려면 stream()
배열을 스트림에 던지려면 Arrays.stream(numlist)
String을 스트림에 던지려면 chars() → IntStream으로 던져진다
.toList(); → 스트림의 요소 List로 변환
.toArray(); → 스트림의 요소 배열로 변환
Array를 스트림에 던지면 IntStream,DoubleStream,LongStream 형식으로 변환된다.
→ Array의 각 요소는 int,double,long타입
List를 스트림에 던지면 Stream<T> 형식으로 변환된다.
→ List의 각 요소는 객체로 처리된다.
Share article