Java - Stream

진경천·2024년 9월 24일

Java

목록 보기
6/9

스트림은 다양한 데이터 소스를 표준화하여 다루는 방법이다.

스트림의 단계는 생성 - 중간 연산 - 최종 연산 총 3가지로 이루어져있다.

스트림 특징

  • 선언형 프로그래밍 방식
  • 원본의 변경 불가
  • 일회성 사용
  • 지연 연산
  • 병렬스트림 사용가능

생성

스트림을 생성할 수 있는 주요 객체

  • 컬렉션 (List, Set 등) // Map 불가
  • 배열
  • 파일
  • 스트림 객체

중간 연산

주요 메서드

메서드 설명
filter(lambda expression) 람다식의 조건에 맞는 요소만 필터링
map(lambda expression) 각 요소에 람다식의 함수를 적용하여 변환
sorted() 요소 정렬
distinct 중복 제거
limit(long maxSize) 스트림의 크기를 maxSize만큼 제한
skip(long n) 처음 n개의 요소를 건너 뜀
mapToInt(lambda expression) 식에 맞는 요소들을 IntStream으로 반환

최종 연산

주요 메서드

리턴 타입 메서드 설명
long count() 요소의 개수 반환
boolean anyMatch(lambda expression) 람다식의 조건을 만족하는 요소가 하나라도 있다면 true 반환
Optional<T> max/min(Comparator c) 최대/최소값을 반환, 스트림이 비어있다면 Optional[null] 반환
Optional<T> reduce(lambda expression) 요소를 하나씩 줄여가며 연산 수행
R collect(Collector c) Collector.toList()등 메서드를 통해 스트림 객체를 Collector로 매핑해서 반환

collect를 쓰지 않고 toList()만 사용하여 List를 반환할 수 있는데,

toList()로 반환한 리스트는 수정이 불가하다.
반면 collect(Collector.toList())로 반환된 리스트는 수정이 가능하다.

장점

• 간결성
➡️ 코드를 간결하게 만들어 코드 가독성 향상
• 선언적 데이터 처리
➡️ "무엇을" 처리할 지에 집중,
"어떻게"에 대한 부분은 Java가 지원
• 병렬 처리 용이
➡️ 병렬 처리를 쉽게 구현할 수 있음
• 함수형 프로그래밍 지원
➡️ 람다식과 함께 고차 함수를 활용하여 더 유연하고 재사용 가능한 코드 작성 가능
• 효율적인 데이터 처리
➡️ 지연 연산을 통해 필요할 때만 데이터 요소를 처리
• 에러 발생 가능성 감소
➡️ 제어문에서 발생할 수 있는 오류 발생을 최소화
• 풍부한 연산 지원
➡️ 필터링, 변환, 정렬, 집계 등 다양한 방식으로 처리할 수 있는 연산자를 지원

Stream 주의 사항

  • 재사용
    ➡️ stream을 다시 사용하는건 안된다. 최종연산 이후 에는 재사용이 안됨.
  • 무한 스트림 생성
    ➡️ 중간 연산을 잘못하게 되면 무한 스트림에 빠질 수 있다.
  • 지역 변수 접근
    ➡️ 람다나 메서드 참조를 사용할 경우 지역변수에 접근할 수 없다.
profile
어중이떠중이

0개의 댓글