[기술정리] stream과 stream API

silver's avatar
Jan 10, 2025
[기술정리] stream과 stream API

stream : APP이 OS로 흐르는 흐름

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

stream API

흐름

notion image

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을 사용할 수 있는 형식

  1. 컬렉션 - stream() 메서드를 사용하여 스트림으로 변환. : List: ArrayList, LinkedList 등 Set: HashSet, TreeSet 등 Queue: LinkedList, PriorityQueue 등
  1. 배열 - Arrays.stream(array) 메서드를 사용하여 스트림으로 변환.
  1. 파일 - Files.lines(Path path)를 사용하여 파일의 각 줄을 스트림으로 읽을 수 있다.
  1. 정수 범위 - IntStream.range(int startInclusive, int endExclusive)와 같은 메서드를 사용하여 특정 범위의 정수로 스트림을 생성할 수 있다.
  1. 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

silver