Java Stream에 대한 간략한 정리

작은선생·2023년 12월 21일
post-thumbnail

Java 8에 도입된 Java Streams는 개발자가 컬렉션을 처리하고 데이터를 조작하는 방식 혁신적이고 강력하게 제공할 수 있는 함수형 프로그래밍이다.

데이터 처리를 선언적이고, 간결하게 제공해 더욱 효율적으로 코드를 작성할 수 있단 장점을 가지고 있다.

Java Stream의 장점

선언적인 방식으로 배열, 컬렉션 같은 요소를 처리할 수 있게 해준다.

데이터 변환 및 작업 파이프라인을 생성할 수 있다.

  • Declarative style(선언적) : 개발자가 세부 사항보다 원하는 결과에 집중할 수 있게 높은 수준의 표현 구문을 제공
  • Parallelism(병렬성) : 멀티 코어 아키텍처를 쉽게 활용하여 최소한의 노력으로 효율적인 병렬처리를 가능하게 함
  • Laziness(게으름) : 특정 작업에 필요한 요소만 처리하여 성능 향상
  • Code readability(코드 가독성) : 상용구를 줄이고 의도를 명확하게해 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만듬

스트림 생성방법

  • 컬렉션 : Collection.stream()
  • 배열 : Arrays.stream(array)
  • Stream Builder : Stream.builder().add(element_1).add(element_2).build()
  • I/O : Files.lines(Path)
  • 무한 스트림 : Stream.iterate(seed, function) or Stream.generate(supplier)

스트림 운용

중간작업, 최종작업을 나눠서 지원한다. 중간작업은 게으르고 새 스트림을 반환하는 반면, 최종작업은 데이터를 처리하고 결과를 반환한다.

중간작업

  • filter(Predicate) : 주어진 조건을 기준으로 요소 필터링
  • map(Function) : 주어진 함수를 사용해 요소를 변환
  • flatMap(Function) : 요소를 스트림으로 변환하고 결과 스트림을 평면화
  • distinct() : 중복된 요소를 제거, 고유한 요소 포함된 스트림 반환
  • sorted(Comparator) : 주어진 비교기준으로 정렬
  • peek(Consumer) : 원본 Stream을 수정하지 않고 각 요소에 대한 작업을 수행

최종연산

  • forEach(Consumer) : 각 요소에 대한 작업 수행
  • toArray() : 요소를 배열로 수집
  • reduce(BinaryOperator) : 요소를 단일 값으로 줄임
  • collect(Collector) : 요소를 변경 가능한 컨테이너로 수집
  • min(Comparator) max(Comparator) : 최소 또는 최대 요소를 찾음
  • count() : 요소의 개수를 계산
  • anyMatch(Predicate)allMatch(Predicate)noneMatch(Predicate) : 조건에 일치 여부 반환
  • findFirst()findAny() : 주어진 조건을 만족하는 첫번째 혹은 모든 요소 검색

Stream 팁 및 모범 사례

  • 가능한 메서드 참조를 사용하면 코드를 읽기 쉽고 간결하게 만들 수 있다.
  • 병렬 스트림을 올바르게 사용하지 않으면 예기치 못한 동작이 발생할 수 있다. 코드가 스레드로부터 안전하고 병렬처리의 이점을 누릴 수 있다고 확신하는 경우에만 이를 사용.
  • 스트림의 성능과 별렬성에 영향을 미칠 수 있으므로 상태 저장 중간 작업 사용을 제한하라.
  • 올바른 리소스 처리를 위해 I/O 사용시 항상 스트림을 닫아야한다.

참고자료

0개의 댓글