[JAVA] Stream

신명철·2022년 3월 12일
0

JAVA

목록 보기
6/14

Stream

JAVA 8 부터 지원하며 컬렉션이나 배열 등에 저장되어 데이터들을 하나씩 참조하여 반복적인 처리를 가능하게 하는 기능이다. Stream을 사용하면 반복문이나 반복자를 사용해 매번 귀찮은 작업을 하지 않아도 된다.

Stream 의 특징

  • 외부 반복을 통해 작업하는 컬렉션들과는 달리 내부 반복을 통해 작업을 수행한다.
  • 스트림은 재사용이 가능한 컬렉션과는 달리 단 한번만 사용할 수 있다.
  • 스트림은 원본 데이터를 변경하지 앟는다.
  • 스트림의 연산은 filter-map 기반의 API를 사용해 지연연산을 통해 성능을 최적화한다.
  • parrallelStream() 메서드를 통해 병렬 처리를 지원한다.

Stream 중개 연산

스트림 API에 의해 생성된 초기 스트림은 중개 연산을 통해서 또 다른 스트림으로 변환된다. 중개 연산은 스트림을 전달받아 스트림을 반환하기 때문에 연속으로 연결해서 사용이 가능하다. 그리고 스트림 중개 연산은 filter-map 기반의 API를 사용하기 떄문에 지연연산을 통해 성능을 최적화 할 수 있다.

필터링

  • filter()
    • 주어진 조건(predicate) 에 맞는 요소만으로 구성된 새 스트림 반환
  • distinct()
    • 내부적으로 equals() 메서드를 수행해 중복 제거

스트림 변환

  • map()
    • 요소들을 주어진 함수에 인수로 전달하고 함수의 반환값들로 새로운 스트림을 만들어 반환한다.
  • flatMap()
    • 해당 스트림의 요소가 배열이면 각 배열의 각 요소의 반환값을 하나로 합친 새로운 스트림을 반환한다.

스트림 제한

  • limit()
  • skip()

스트림 정렬

  • sorted()
    • 해당 스트림을 comparator를 이용해 정렬

Stream 최종 연산

스트림 API에서 중개 연산을 통해 변환되었던 스트림은 마지막으로 최종 연산을 통해서 각 요소를 소모해 결과를 표시한다.
즉, 지연되었던 모든 중개 연산들이 최종 연산 시 모두 수행되는 것이다. 소모된 스트림은 다시 사용할 수 없다.

  • forEach()
    • 출력
  • reduce()
    • 소모, 요소를 차례로 소모하며 함수를 수행한다.
  • findFirst(), findAny()
    • 첫 번째 요소를 참조하는 Optinal 객체 반환
  • anyMatch()
    • 스트림 일부 요소가 특정 조건을 만족할 경우 true
  • allMatch()
    • 스트림 모든 요소가 특정 조건을 만족하면 true
  • noneMatch()
    • 스트림 모든 요소가 특정 조건을 만족하지 않으면 true
  • count()
    • 스트림 요소의 총 개수를 long 타입으로 반환
  • min(), max()
    • 스트림 요소의 최소/최대 값을 가지는 요소를 참조하는 Optional 객체 반환
  • sum()
    • 모든 요소의 합 반환
  • average()
    • 평균 값을 갖는 기본 타입을 래핑 한 Optional 객체 반환
  • collect()
    • 메서드의 인수로 전달되는 Collectors 객체에 구현된 방법대로 스트림의 요소를 수집한다.
    • Collectors 클래스에는 미리 정의된 다양한 방법이 클래스 메서드로 정의되어 있다. 이 외에도 사용자가 직접 Collector 인터페이스를 구현해 수집 방법을 정의할 수도 있다.
    • 배열이나 컬렉션으로 변환
      • toArray(), toCollection(), toList(), toSet(), toMap()
    • 요소의 통계나 연산 메서드 같은 동작 수행
      • counting(), maxBy(), minBy(), summingInt(), averagingInt() 등
    • 요소의 소모와 같은 동작 수행
      • reducing(), joining()
    • 요소의 그룹화와 분할
      • groupingBy(), partitioningBy()
profile
내 머릿속 지우개

0개의 댓글