[Java8] Stream API

hyozkim·2020년 4월 8일
0

StreamAPI

목록 보기
1/4
post-thumbnail

Stream API를 사용하여 코드를 짜면 가독성에 좋고, Optional 클래스와 같이 java8 버전 이후 나온 기술 중 최근 현업에서 많이 사용하는 듯하다. 면접 질문에서도 심심찮게 질문을 받아볼 수 있었고, 정리해두고 사용할때마다 참고하고자 한다. 또한, 부족한 부분들을 추가하며 만들어가자.

살펴볼 내용

  • Stream 생성하기 - 스트림 생성

    • Array / Collection / 빈 스트림
    • Stream.builder() / Stream.generate() / Stream.iterate()
    • stream(), parallelStream()
    • range(), rangeClosed
    • of(*)
    • lines()
    • splitAsStream()
  • Stream 가공하기 - 중간 연산자

    • filter
    • map, flatMap
    • peek - '살짝 들여다본다'
    • sorted -
    • distinct - 중복값 제거
    • limit - 앞선 n개 요소까지
    • skip - 앞선 n개 요소까지 건너뛰
    • concat - 두 Stream을 연결한다.
    • mapToInt, mapToLong, mapToDoubley
  • Stream 결과 만들기 - 최종 연산자

    • Calculating(count, sum, min, max, average)
    • Reduction(reduce)
    • Collecting
    • Matching
    • Iterating
    • forEach
    • 람다
// 스트림 생성 -> 중간 연산자 -> 최종 연산자
int result = list.stream()	// 스트림 생성
		.filter( ... )	// 중간 연산자
		.map( ... )	// 중간 연산자
		.count();	// 최종 연산자

스트림 Stream

자바 8 이전에 for, if 문을 사용해서 객체들을 다루었다면 자바 8 이후에 추가된 기능으로, stream 형태의 요소에 함수형 연산자를 지원해주는 클래스이다.

그래서 Stream이 뭔데?

스트림은 '데이터 흐름'입니다.
배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있습니다. 또한 람다를 이용해서 코드의 양을 줄이고 가독성 좋은 코드로 표현할 수 있습니다. 즉, 배열과 컬렉션을 함수형으로 처리할 수 있습니다.

또 하나의 장점은 간단하게 병렬처리(multi-threading)가 가능하다는 점입니다. 하나의 작업을 둘 이상의 작업으로 잘게 나눠서 동시에 진행하는 것을 병렬 처리(parallel processing)이라고 합니다. 즉 쓰레드를 이용해 많은 요소들을 빠르게 처리할 수 있습니다.

알아둘 것

  • Stream은 재사용이 불가능하다.

재사용하면 다음과 같은 에러가 발생한다.
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed

  • 병렬 스트림은 여러 쓰레드가 작업한다.

  • 중개 연산은 미리하지 않는다. 지연 연산을 한다.(나중에 최종연산(forEach, .. )가 실행될 때 같이 실행된다. 이로써 미리 계산하면서 두번 순회하는 것을 안할 수 있게 된다.

profile
차근차근 develog

0개의 댓글