[TIL] 221017 - 자바 : 스트림

yujamint·2022년 10월 17일
0

스트림

: 컬렉션이나 배열의 원소를 흐름으로 간주하는 것

함수형 프로그래밍

: 수학적 함수의 계산을 통해 자료를 처리하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임

함수형 프로그래밍이기 위한 조건,특징

  • 함수의 순수성 : 동일한 인자를 통해 다수 호출되는 함수들은 항상 동일한 값을 반환
    • 함수 실행하는 동안 side effect 존재하지 않는다.
      • side effect?
      • 함수 외부에 정의된 변수를 수정
      • 콘솔 출력
      • 예외 발생
      • 파일 입출력
    • 함수 실행하기 위한 상태가 없다.
  • 함수는 일급이며 고차일 수 있음
  • 변수의 불변
  • 함수의 참조 투명성
  • 람다 미적분 기반

외부 반복자와의 차이

  • 외부 반복자(for, while)의 경우에는 반복해서 컬렉션 요소에 직접 접근하며 어떻게 구현해야 될지를 중심적으로 생각해야 되지만, 내부 반복자(stream)의 경우에는 컬렉션 내부에서 요소를 반복시키고, 개발자는 요소당 처리할 코드만 작성하면 된다. 즉, 객체를 통해 무엇을 할지를 중심적으로 생각할 수 있다. 하지만, stream에 내부적으로 이미 구현돼있는 함수를 사용하는 것이기 때문에, 기능 사용에 있어서 제한될 수 있다.
  • stream()은 순수함수이기 때문에 병렬 처리가 가능하다.

스트림 얻기

  • 컬렉션 스트림 얻기 : 컬렉션에는 이미 스트림이 구현되어 있다. list.stream()과 같이 사용하면 된다.
  • 배열 스트림 얻기 : Arrays.stream(int [] arr) 과 같이 사용
  • 숫자 범위 스트림 얻기 : IntStream stream = IntStream.rangeClosed(1, 100);

스트림 파이프라인

여러 개의 스트림이 연결된 구조 컬렉션/배열.스트림얻기().중간스트림().중간스트림().최종처리()

  • 대량의 데이터를 가공해서 축소하는 것을 리덕션이라고 한다.
    • 합계, 평균값, 최소값, 최대값 등이 대표적인 리덕션 결과물
  • 중간 스트림이 생성될 때, 요소들이 바로 중간 처리(필터링,매핑,정렬) 되는 것이 아니라 최종 처리 시작되기 전까지 중간 처리는 지연되었다가 최종 처리가 시작되면 컬렉션 요소가 하나씩 중간 스트림에서 처리되고 최종 처리까지 오게 된다.
    • lazy loading!
📌 중간 처리 스트림
  • 반환값이 스트림 형태
  • 메소드 종류
    • 필터링 / 중복제거 filter, distinct
    • 매핑 flatMapXXX, mapXXX, asDobuleStream()
    • 정렬 sorted
    • 중간 결과물 반복 peek
📌 최종 처리 스트림
  • 반환값이 기본타입이거나 OptionalXXX
    • Optional 클래스 : 반환 값이 있을 수도 있고, 없을 수도 있을 때 사용한다.

      OptionalDobule optional = list.stream().mapToInt(Integer :: intValue).average();
      System.out.println(optional.isPresent() ? optional.getAsdouble() : "0.0"); 
    • optional에 값이 들어있다면 출력, null이라면 “0.0” 출력하는 코드

  • 메소드 종류
    • 매칭 allMatch, anyMatch, noneMatch
      • 리턴 타입이 boolean
    • 기본 집계 count, max, min, average, sum, findFirst
    • 수집 collect
    • 최종 결과물 반복 forEach
profile
개발 기록

0개의 댓글